这是上一个问题的后续:Type-level Map with DataKinds,从它收到的两个答案开始。
我的目标是采用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)
当我实际上尝试使用几种类型来执行此操作时,我遇到了一个问题。TypeMap 的 type-function " 参数必须将HList
元素类型作为其最后一个参数并返回一个新类型。这有时可以正常工作:
test :: HList rqs -> HList (TypeMap ((,) Int) rqs)
test HNil = HNil
test (HCons x xs) = HCons (3,x) $ test xs
但是如果我想在 test 的定义中切换元组的顺序呢?我的第一次尝试是定义一个类型同义词:
type RevIntTup b = (b,Int)
test2 :: HList rqs -> HList (TypeMap RevIntTup rqs)
test2 HNil = HNil
test2 (HCons x xs) = HCons (x,3) $ test2 xs
但是,当然,您不能部分应用 type synonyms,这肯定会奏效。有没有(其他)方法可以实现这一目标?