Это продолжение предыдущего вопроса: Карта на уровне типов с типами данных, начиная с из двух полученных ответов.
Моя цель — взять HList
произвольных типов и превратить их в список связанных/производных типов.
type family TypeMap (a :: * -> *) (xs :: [*]) :: [*]
type instance TypeMap t '[] = '[]
type instance TypeMap t (x ': xs) = t x ': TypeMap t xs
data HList :: [*] -> * where
HNil :: HList '[]
HCons :: a -> HList as -> HList (a ': as)
Когда я на самом деле попытался сделать это с несколькими типами, я столкнулся с проблемой. Аргумент type-function " для TypeMap должен принимать тип элемента HList
в качестве последнего аргумента и возвращать новый тип. Иногда это работает нормально:
test :: HList rqs -> HList (TypeMap ((,) Int) rqs)
test HNil = HNil
test (HCons x xs) = HCons (3,x) $ test xs
Но что, если я хочу изменить порядок кортежа в определении теста? Моей первой попыткой было определить синоним типа:
type RevIntTup b = (b,Int)
test2 :: HList rqs -> HList (TypeMap RevIntTup rqs)
test2 HNil = HNil
test2 (HCons x xs) = HCons (x,3) $ test2 xs
Но, конечно, вы не можете частично введите синонимы, что, безусловно, поможет. Есть ли (другой) способ добиться этого?