为什么可以在Haskell中列出这样的列表:
slist = [ [], [[]], [[],[[]]] ]
据我了解,每个元素在这里都有各种类型(例如数学中的Ø,{Ø}等)。 ghci说:
> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]
从形式上看,我看到了不同的注释。
换句话说,第一个元素是一个简单的空列表,第二个元素是一个列表(!),依此类推。
怎么了?为什么Haskell会认为它们是同一类型?
答案 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
是一个空列表列表列表。