在类型声明映射中使用类型同义词

时间:2014-06-12 11:55:26

标签: haskell type-families

我已经实现了像这样的地图类型类型

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.

有没有办法解决这个问题而无需创建新的数据类型(或新类型)?

1 个答案:

答案 0 :(得分:6)

不幸的是,如果不创建新的数据类型(或newtype),就无法解决这个问题。你正在寻找的似乎是一个类型级别的lambda(就像你在许多正式的Haskell相关的计算中一样,如System Fw及其扩展),但不幸的是Haskell没有类型级lambda。类型同义词可能看起来像是可以用于此,但不幸的是,它们必须在提到它们时完全应用。您需要使用newtype或数据类型,如您自己提到的那样..

相关问题