我已经实现了像这样的地图类型类型
type family MapT (t :: * -> *) (e::[*])
type instance MapT t '[] = '[]
type instance MapT t (a ': as) = (t a) ': (MapT t as)
它适用于类型构造函数:
type MList = MapT Maybe '[Int, String]
给出
'[Maybe Int, Maybe String]
但是,我试试
type M a = Maybe a
type MList' = MapT M '[Int, String]
它不起作用。
我也试过打字家庭
type family M a
type instance M a = Maybe a
但它仍然不起作用,说
`Type synonym `M` should have 1 argument.
有没有办法解决这个问题而无需创建新的数据类型(或新类型)?
答案 0 :(得分:6)
不幸的是,如果不创建新的数据类型(或newtype),就无法解决这个问题。你正在寻找的似乎是一个类型级别的lambda(就像你在许多正式的Haskell相关的计算中一样,如System Fw及其扩展),但不幸的是Haskell没有类型级lambda。类型同义词可能看起来像是可以用于此,但不幸的是,它们必须在提到它们时完全应用。您需要使用newtype或数据类型,如您自己提到的那样..