Haskell中的嵌套空列表的列表

时间:2018-09-23 10:54:05

标签: list haskell types

为什么可以在Haskell中列出这样的列表:

slist = [ [], [[]], [[],[[]]] ]

据我了解,每个元素在这里都有各种类型(例如数学中的Ø,{Ø}等)。 ghci说:

> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]

从形式上看,我看到了不同的注释。

换句话说,第一个元素是一个简单的空列表,第二个元素是一个列表(!),依此类推。

怎么了?为什么Haskell会认为它们是同一类型?

3 个答案:

答案 0 :(得分:7)

您是正确的,在Haskell列表中,所有元素都必须是同一类型。实际上,您的示例中的类型是:

> :t slist
slist :: [[[[a]]]]

但是空列表[]可以具有任何类型,只要其形式为[b],但是有许多可能的b。因此,有许多可能的具体类型。其中之一就是b的类型为[[[a]]],就像您的slist一样。

答案 1 :(得分:6)

看看这样一个列表的第一个元素的类型:

> head [ [], [[]], [[],[[]]] ]
[]
it :: [[[t]]]

不是t,而是[[[t]]]

  

为什么我可以在Haskell中列出这样的列表

因为表达式的类型没有问题。

  

怎么了?为什么Haskell会认为它们是同一类型?

t中的

[[[[t]]]]不是最终类型,它是类型变量。因此,此列表的第一个元素的类型可能是a[b][[c]][[[t]]]

答案 2 :(得分:3)

一个空列表可以是任何类型的列表。它可以是数字列表,字符串列表或列表列表。我的意思是,为什么不让您拥有一个空列表列表,甚至一个空列表列表?

所以在您的列表中:

--a     b       c     d
[ [], [ [] ], [ [], [ [] ] ] ]

d是一个空列表,c是一个空列表列表,b是一个空列表列表,a是一个空列表列表列表。