自动键入嵌套列表

时间:2015-06-14 16:34:13

标签: haskell

在理查德·伯德的在功能上与Haskell一起思考的过程中,我遇到了Haskell类型系统的演示,我觉得这很令人费解(第44页):

  

[ [], [[]], [[[]]] ] :: [[[[a]]]]

     

为了解释,让主列表具有类型[b]。第一个元素是   列表,所以b=[c]。第二个元素是列表列表,因此c=[d]。该   第三个元素是列表列表,因此d=[a]

此类签名是否表示主列表的第一个元素的类型为[[[a]]]?我不明白这是怎么回事。

1 个答案:

答案 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]]]