Я хотел расширить идею fst
и snd
для типов классов.Итак, я написал классы типов
class Fstable f where
fst' :: f a -> a
class Sndable f where
snd' :: f a -> a
Было достаточно легко написать экземпляр для Sndable
, просто следующее
instance Sndable ((,) a) where
snd' (a, b) = b
Однако экземпляр для Fstable
не так прост,Теперь я бы очень хотел использовать flip
на (,)
для создания * -> *
, который я хочу.Но на уровне типов переворачивания не происходит, поэтому мне придется самому создать или сделать * -> *
, который я хочу сам.
Я ничего не делал на уровне типов за пару месяцев, но помнюодин из способов сделать функции уровня типа - это использование FunctionalDependencies
.Я могу сделать бросок (,)
достаточно легко:
{-# Language MultiParamTypeClases, FunctionalDependcies, FlexibleInstances #-}
class BackTuple a b c | a b -> c
instance BackTuple a b (b, a)
Но BackTuple
имеет вид * -> * -> * -> Constraint
вместо * -> * -> *
, который я хочу.
Итак, я попытался использоватьсиноним типа
{-# Language TypeSynonymInstances #-}
type W a b = (b, a)
instance Fstable (W a) where
fst' (a, b) = a
Но я не могу карри, поэтому W a
жалуется на то, что ему не W
предоставляется неверное количество аргументов.Я чувствую, что, возможно, семейство типов могло бы это исправить, но я не знаю, с чего начать.
Я пытался создать флип, но я действительно не знал, с чего начать.
Как мне сделать бросок (,)
?