为什么 Haskell 不能解析 [[]] (列表列表)的类型?
为什么不是简单的 * -> *,因为我可以给它一个像 Int 这样的类型,然后得到 [[Int]],它是一种 *。
问问题
360 次
2 回答
8
我认为它与 with 相同Maybe Maybe
,尽管在后一种情况下原因可能更清楚:“外部”类型构造函数期望传递一种类型*
,但看到类型构造函数* -> *
(“内部” Maybe
/ []
)并抱怨. 如果我是正确的,这并不是:kind
GHCi 功能的问题,而是找到正确的语法来表达更高种类的类型构造函数的组合。
作为一种解决方法,类似
: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 回答