これは、前の質問のフォローアップです: Type-level Map with DataKinds、受け取った2つの回答から始めます。
私の目標は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 を部分的に適用することはできません。これを達成する(他の)方法はありますか?