169 похожих чатов

Data Union fs x where Here :: f

x -> Union (f : fs) x
There :: Union fs x -> Union (f : fs) x

class Remove f fs gs | f fs -> gs where
remove :: Union fs x -> Either (f x) (Union gs x)

instance {-# OVERLAPS #-} Remove f (f : fs) fs where
remove = union Left Right

instance Remove f fs gs => Remove f (g : fs) (g : gs) where
remove = union (Right . Elem) (fmap There . remove)

handle
:: forall f fs gs a x
. (Remove f fs gs)
=> (f x -> a)
-> (Union gs x -> a)
-> Union fs x -> a
handle handler rest = either handler rest . remove

type A = Union [[], Maybe, Identity] Int
type B = Union [Identity, [], Maybe] Int

foo :: A -> B
foo = handle @Maybe do _
$ _

Глядя на этот код, GHC заявляет:

• Found hole: _rest :: Union '[[], Maybe] Int -> B
• Found hole: _handler :: Maybe Int -> B
• Couldn't match type ‘Identity’ with ‘Maybe’
arising from a functional dependency between:
constraint ‘Remove Maybe '[Maybe, Identity] '[Maybe]’
arising from a use of ‘handle’
instance ‘Remove f (f : fs) fs’

Ни у кого, случайно, не завалялось под рукой выхода из этой ситуации?

4 ответов

10 просмотров

что именно?

TOV_MULTIMASSO- Автор вопроса

Для начала, GHC откуда-то откопал Remove Maybe '[Maybe, Identity] '[Maybe], которое не соответствует ни одному инстансу. Я пытался сделать gs зависимой переменной, но у GHC начинаются проблемы как при фундепах, так и если просто вынести gs в семейство типов

Хм, у меня такое чувство что в undecidableinstances+fundeps что-то очень сильно сломано. Минимизируя, вот в таком {-# LANGUAGE Haskell2010, DataKinds, TypeOperators, FlexibleContexts, FlexibleInstances, UndecidableInstances, FunctionalDependencies, StandaloneKindSignatures #-} module WTF where import Data.Kind import Data.Proxy type Delete :: Type -> [Type] -> [Type] -> Constraint class Delete val src dst | val src -> dst instance Delete val (val:src) src instance Delete val src dst => Delete val (oth:src) (oth:dst) data A data B data C del :: Delete A [A, B, C] x => Proxy x del = Proxy test1 :: Proxy [B, C] test1 = del test2 :: Proxy _ test2 = del test1 нормально тайпчекается, а test2 дает те же ошибки WTF.hs:35:16: error: • Found type wildcard ‘_’ standing for ‘'[A, C] :: [*]’ To use the inferred type, enable PartialTypeSignatures • In the first argument of ‘Proxy’, namely ‘_’ In the type ‘Proxy _’ In the type signature: test2 :: Proxy _ | 35 | test2 :: Proxy _ | ^ WTF.hs:36:9: error: • Couldn't match type ‘B’ with ‘A’ arising from a functional dependency between: constraint ‘Delete A '[A, B, C] '[A, C]’ arising from a use of ‘del’ instance ‘Delete val (val : src) src’ at WTF.hs:21:10-33 • In the expression: del In an equation for ‘test2’: test2 = del | 36 | test2 = del То есть гхц сначала сам же выводит дырку как [A, C], а потом справедливо говорит что это на самом деле должно быть [B, C]. Но то что test1 тайпчекается не менее странно, так как инстансы вроде бы должны вызывать functional dependency conflict, и тут по идее даже overlapping прагмы не должны помогать, а все "работает" даже без них. Если же добавить instance Delete val '[] '[] то нормально тайпчекается такое, хотя по фундепу там должен быть только один возможный тип test1 :: Proxy [B, C] test1 = del test2 :: Proxy [A, B, C] test2 = del Кмк звучит как баг. @slowpnir, будешь репортить?

Похожие вопросы

Обсуждают сегодня

Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Добрый день! Подскажите, пожалуйста: какими компетенциями нужно обладать, чтобы претендовать на работу эрланг (отдельная благодарность, если про элексир тоже подскажете) разр...
via ☸️ led
20
Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
Можно попросить небольшое ревью кода? Тут немнога, я ничего интереснее не придумал, чем написать аналог tree в качестве практики с cmake. https://github.com/hrimov/tree-unix/...
Andrew Hrimov
11
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Карта сайта