为什么GHCi不能解决那种[[]]?

时间:2010-06-08 04:45:13

标签: haskell types polymorphism ghc

为什么Haskell不能解决[[]](列表列表)的种类? 为什么不简单* - > *,因为我可以给它一个类似Int的类型,并获得[[Int]],这是一种*。

2 个答案:

答案 0 :(得分:8)

我认为它与Maybe Maybe相同,尽管在后一种情况下原因可能更清楚:“外部”类型构造函数希望传递一种类型*,但是看到了类型* -> *的构造函数(“内部”Maybe / [])并抱怨。如果我是正确的,这对于GHCi的:kind功能来说并不是真正的问题,而是找到正确的语法来表达高级类型构造函数的组合。

作为解决方法,例如

:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
我可以使用

(启用相应的语言扩展程序 - ExistentialQuantification - 启用forall语法)。

答案 1 :(得分:4)

如果我们将[[]]视为[] [],那么很明显它被证明是[] :: * -> *

如果你真的想要一个“列表列表”,你需要编写两种类型* -> *的类型构造函数。如果没有一点样板,你就不能这样做,因为Haskell没有类型级别的lambda。你可以这样做:

newtype Comp f g a = Comp { unComp :: f (g a) }

现在你可以写:

type ListList = Comp [] []

使用它编写函数:

f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp

这样的Functor组合在几个方面都有应用,特别是Swierstra的"Data types a la carte"