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