Size: a a a

2021 March 17

AS

Anton Sorokin in Haskell
Jerzy Syrowiecki
а в чём проблема?
• No instance for (Curryable list)
   arising from a use of ‘hetCurry'’
 Possible fix:
   add (Curryable list) to the context of
     the type signature for:
       hetCurry :: forall (list :: [*]) a.
                   (HList list -> a) -> Curry list a
• In the expression: hetCurry'
 In an equation for ‘hetCurry’: hetCurry = hetCurry'
источник

AS

Anton Sorokin in Haskell
Если
hetCurry = hetCurry'
источник

JS

Jerzy Syrowiecki in Haskell
Anton Sorokin
class Curryable (list :: [Type]) where
 hetCurry' :: (HList list -> a) -> Curry list a

instance Curryable '[] where
 hetCurry' f = f Unit

instance Curryable bs => Curryable (a ': bs) where
 hetCurry' f a = hetCurry' $ f . (a :>>)

hetCurry :: forall list a. (HList list -> a) -> Curry list a
hetCurry = hetCurry'
Понадобилась мне недавно одна функция, никак написать не получается

Понятно, что компилятор не понимает, что Curriable a выполняется всегда, но я готов ради благого дела его перехетрить (пробовал Incoherent instances и unsafeCoerceConstraint, ловил либо то, что всегда использовался инстанс который никогда не должен вызываться, либо сегфолты если unsafeCoerceConstraint). Если кто то умеет писать такую функцию или хотя бы доказывать что это невозможно - помогите пожалуйста

type family Curry (list :: [Type]) a :: Type where
 Curry '[] a = a
 Curry (b ': cs) a = b -> Curry cs a
источник

AS

Anton Sorokin in Haskell
Не, мне нужно что то вроде
myPlus :: Int -> Int -> Int
myPlus = hetCurry @'[Int, Int] (\(x :>> y :>> Unit) -> x + y)
источник

AS

Anton Sorokin in Haskell
При этом именно с HList (то есть надо подставлять в функцию от HList значения по одному)
источник

JS

Jerzy Syrowiecki in Haskell
Anton Sorokin
class Curryable (list :: [Type]) where
 hetCurry' :: (HList list -> a) -> Curry list a

instance Curryable '[] where
 hetCurry' f = f Unit

instance Curryable bs => Curryable (a ': bs) where
 hetCurry' f a = hetCurry' $ f . (a :>>)

hetCurry :: forall list a. (HList list -> a) -> Curry list a
hetCurry = hetCurry'
Понадобилась мне недавно одна функция, никак написать не получается

Понятно, что компилятор не понимает, что Curriable a выполняется всегда, но я готов ради благого дела его перехетрить (пробовал Incoherent instances и unsafeCoerceConstraint, ловил либо то, что всегда использовался инстанс который никогда не должен вызываться, либо сегфолты если unsafeCoerceConstraint). Если кто то умеет писать такую функцию или хотя бы доказывать что это невозможно - помогите пожалуйста

type family Curry (list :: [Type]) a :: Type where
 Curry '[] a = a
 Curry (b ': cs) a = b -> Curry cs a
из какой библиотеки HList и (:>>)? пытаюсь воспроизвести у себя
источник

AS

Anton Sorokin in Haskell
HList самодельный, как и Curry (не сразу вспомнил, извиняюсь)

type family Curry (list :: [Type]) a :: Type where
 Curry '[] a = a
 Curry (b ': cs) a = b -> Curry cs a

infixr 4 :>>

data HList :: [Type] -> Type where
 (:>>) :: a -> HList bs -> HList (a ': bs)
 Unit :: HList '[]
источник

JS

Jerzy Syrowiecki in Haskell
Anton Sorokin
• No instance for (Curryable list)
   arising from a use of ‘hetCurry'’
 Possible fix:
   add (Curryable list) to the context of
     the type signature for:
       hetCurry :: forall (list :: [*]) a.
                   (HList list -> a) -> Curry list a
• In the expression: hetCurry'
 In an equation for ‘hetCurry’: hetCurry = hetCurry'
если дописать это требование в сигнатуру, то работает
источник

AS

Anton Sorokin in Haskell
Это да. Я как раз хочу не писать по некоторой причине
источник

AS

Anton Sorokin in Haskell
И специально завел без штриха, чтобы не было констрейнта
источник

AS

Anton Sorokin in Haskell
Он всегда выполняется, так что можно и всякие unsafe штуки поделать, но у меня не получилось
источник

JS

Jerzy Syrowiecki in Haskell
компилятор может сам найти инстансы для конкретных типов, но

в общем случае наличие переменной типа не означает наличия типа в ней
источник

JS

Jerzy Syrowiecki in Haskell
unsafe не будет работать, потому что во время исполнения нет типов, они стираются, а вот инстансы есть, и их нельзя взять из воздуха, чтобы коёрсить
источник

JS

Jerzy Syrowiecki in Haskell
я бы попробовал ограничить фантазии компилятора закрытым семейством
источник

AS

Anton Sorokin in Haskell
Jerzy Syrowiecki
unsafe не будет работать, потому что во время исполнения нет типов, они стираются, а вот инстансы есть, и их нельзя взять из воздуха, чтобы коёрсить
Надо бы это большими красными буквами в документации unsafeCoerceConstraint написать. Ладно, поищу другой путь
источник

AS

Anton Sorokin in Haskell
Jerzy Syrowiecki
я бы попробовал ограничить фантазии компилятора закрытым семейством
Тут не очень понял про что вы, мне нужна именно функция конкретного типа. Готов поверить, что ее видимо не существует, спасибо
источник

JS

Jerzy Syrowiecki in Haskell
что-то я сомневаюсь, что такое вообще возможно — во время исполнения отличить непустой список типов от пустого, чтобы выбрать функцию
источник

JS

Jerzy Syrowiecki in Haskell
короче, с указанием класса всё работает, я бы не парился
источник

MK

Maxim Koltsov in Haskell
Хех, капабилити ещё развивается
источник

EZ

Egor Zorin in Haskell
Как установить эти модули через stack?
источник