在理查德·伯德的在功能上与Haskell一起思考的过程中,我遇到了Haskell类型系统的演示,我觉得这很令人费解(第44页):
[ [], [[]], [[[]]] ] :: [[[[a]]]]
为了解释,让主列表具有类型
[b]
。第一个元素是 列表,所以b=[c]
。第二个元素是列表列表,因此c=[d]
。该 第三个元素是列表列表,因此d=[a]
此类签名是否表示主列表的第一个元素的类型为[[[a]]]
?我不明白这是怎么回事。
答案 0 :(得分:4)
让我们改写一下:
l = [l1, l2, l3]
where l1 = []
l2 = [[]]
l3 = [[[]]]
现在我们分配类型变量:ab initio
l1 :: b
l2 :: b
l3 :: b
因为它们都必须具有相同的类型,因此l
具有某种类型[b]
。现在,更具体地说,
l1 :: [c]
l2 :: [[d]]
l3 :: [[[e]]]
证明括号的数量。但这些仍然必须是同一类型b
,即实际上
l1 :: [[[e]]]
l2 :: [[[e]]]
l3 :: [[[e]]]
和
l = [ [] :: [[[e]]]
, [[]] :: [[[e]]]
, [[[]]] :: [[[e]]] ]
整体上有[[[[e]]]]
类型。或者,如果您愿意,[[[[a]]]]
。
如果考虑更有趣的具体例子,也许这一切都会变得更加清晰。以下是[Int]
列表:
[1,2,3]
[1]
[0]
[]
这些是[[Int]]
列表:
[ [1,2], [1,2,3] ]
[ [1], [2] ]
[ [1], [] ]
[ [] ]
[ ]
这些是[[[Int]]]
列表:
[ [[1]], [[2],[]], [[3],[],[]] ]
[ [[]], [[1]], [[2,3]] ]
[ [], [[]] ]
[ [[]] ]
[ ]
请注意,所有类型都可以使用空列表[]
。 [[]]
和[[Int]]
只能包含空列表[[[Int]]]
的列表,包含仅列表空列表的列表需要双列嵌套列表[[[Int]]]