List Haskell中嵌套的空列表列表

List Haskell中嵌套的空列表列表,list,haskell,types,List,Haskell,Types,为什么可以在Haskell中列出这样的列表: slist = [ [], [[]], [[],[[]]] ] 据我所知,这里的每个元素都有不同的类型(比如在数学中:Ø、{Ø}等等)。ghci说: > :t [] [] :: [t] > :t [[]] [[]] :: [[t]] 在形式上,我看到了不同的注释 换句话说,第一个元素是一个简单的空列表,第二个元素是列表(!)列表,依此类推 怎么了?为什么Haskell认为它们是同一类型?你是对的,在Haskell列表中,所有元素都必须

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

slist = [ [], [[]], [[],[[]]] ]
据我所知,这里的每个元素都有不同的类型(比如在数学中:Ø、{Ø}等等)。ghci说:

> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]
在形式上,我看到了不同的注释

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


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

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

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

但是空列表
[]
可以有任何类型,只要它的形式是
[b]
,但是有许多可能的
b
s。所以有很多可能的混凝土类型。其中之一是
b
的类型为
[[[a]]]
,如您的
列表中的

请查看此类列表中第一个元素的类型:

> head [ [], [[]], [[],[[]]] ]
[]
it :: [[[t]]]
它不是
t
,而是
[[[t]]]

为什么我能在哈斯克尔列出这样的清单

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

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


[[[t]]]
中的
t
不是最终类型,而是类型变量。这就是为什么此列表的第一个元素的类型可以是
a
[b]
[[c]]
[[t]]]

空列表可以是任何类型的列表。它可以是数字列表、字符串列表或列表列表。我的意思是,为什么不允许你有一个空列表,甚至是一个空列表

因此,在您的列表中:

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

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

@Vladimir你是什么意思?我只是复制并粘贴了您问题中的列表,并将空列表命名。
slist
只有3个元素,请参见
length slist
@Vladimir我是在标记空列表,而不是
slist
的元素。我添加了一些空格以使其更清晰。那么为什么在一条记录中使用两个字母(a和c)表示空列表?@Vladimir,因为不同的空列表在这里有不同的类型。例如,
a
的类型等于
[b]
的类型(但明显不是
b
的类型)。因此,列表中的元素都有相同的类型,因为单个空列表不这样。如果你想生成“列表”,请考虑<代码>数据NestListA:= Erm A巢穴[A] /代码>,然后你可以写“代码>鸟巢[St[],鸟巢[S][]]/Cave>到任何深度。@ AJFarmar,也许你是指<代码>数据NeStdLista= Eelm A巢。[NestedList a]
@WillNess你说得对,但我现在不能改变它!我们可以强调,这只可能是因为使用了几个文本
[]
s,但是如果我们尝试
让s=[[],[[[]]在[s][s],[s]]]
中,那么它就不能……可能……等等……不,它也可以!:)因为
s
不是“东西”,但“多态定义”!真正不起作用的是
(\s->[s[s],[s]]])[[],[[]]]
,因为lambda函数的参数类型是单态的。