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