6

为什么 Haskell 不能解析 [[]] (列表列表)的类型?
为什么不是简单的 * -> *,因为我可以给它一个像 Int 这样的类型,然后得到 [[Int]],它是一种 *。

4

2 回答 2

8

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

作为一种解决方法,类似

:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)

可以使用(打开适当的语言扩展 -- ExistentialQuantification,我认为 -- 以启用forall语法)。

于 2010-06-08T05:00:00.453 回答
4

如果我们 desugar [[]]as[] []那么很明显它是不好的,因为[] :: * -> *.

如果你真的想要一个“列表列表”,你需要组成两个 kind 类型的构造函数* -> *。如果没有一点样板文件,你就无法做到这一点,因为 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

像这样的函子组合在多个领域都有应用,尤其是 Swierstra 的“点菜数据类型”

于 2010-08-13T09:03:38.330 回答