Haskell,列表理解输出空列表。为什么?
Haskell,列表理解输出空列表。为什么?,haskell,list-comprehension,evaluation,Haskell,List Comprehension,Evaluation,[x:ys|x您的期望有两个问题: x:ys始终创建一个新列表;x:[]=[x],而不是x:[]==x 即使x:[]==x,事实仍然是ys您的期望存在两个问题: x:ys始终创建一个新列表;x:[]=[x],而不是x:[]==x 即使x:[]==x,事实仍然是ys列表理解表示嵌套循环: [x:ys | x<-[1,2], ys<-[]] == do { x<-[1,2] ; do { ys<-[] ; return (x:ys) } } == { for each x
[x:ys|x您的期望有两个问题:
x:ys
始终创建一个新列表;x:[]=[x]
,而不是x:[]==x
即使x:[]==x
,事实仍然是ys您的期望存在两个问题:
x:ys
始终创建一个新列表;x:[]=[x]
,而不是x:[]==x
即使x:[]==x
,事实仍然是ys列表理解表示嵌套循环:
[x:ys | x<-[1,2], ys<-[]]
==
do { x<-[1,2] ; do { ys<-[] ; return (x:ys) } }
==
{ for each x in [1,2]: { for each ys in []: yield (x:ys) } }
==
{ { for each ys in []: yield (1:ys) }
; { for each ys in []: yield (2:ys) }
}
==
{ { for none: yield ... } ; { for none: yield ... } }
==
{ none ; none }
==
none.
因此,如果为第一个列表的每个元素生成的列表为空,则整个列表也为空,因为concat[]、[]、[]、[]==[]
另请参见:列表理解表示嵌套循环:
[x:ys | x<-[1,2], ys<-[]]
==
do { x<-[1,2] ; do { ys<-[] ; return (x:ys) } }
==
{ for each x in [1,2]: { for each ys in []: yield (x:ys) } }
==
{ { for each ys in []: yield (1:ys) }
; { for each ys in []: yield (2:ys) }
}
==
{ { for none: yield ... } ; { for none: yield ... } }
==
{ none ; none }
==
none.
因此,如果为第一个列表的每个元素生成的列表为空,则整个列表也为空,因为concat[]、[]、[]、[]==[]
另请参见:想象两个箭头代表嵌套的for循环;外部箭头位于xs
上方,内部箭头位于ys
上方。管道左侧的是循环体。@Sebastian Redl,你能将注释移动到回答部分吗?如果你只是想连接两个列表,你可以执行[1,2]+[]
,它生成预期的[1,2]
{for each x in[1,2]:{for each ys in[]:yield(x:ys)}
={{for each ys in[]:yield(1:ys)};{for each ys in[]:yield(2:ys)}
={for none:yield…};{for none:yield…}
={
=none
.ys在结果中不是一个列表。试着想象一下,这两个箭头代表嵌套的for循环;在xs
上方的外部箭头,在ys
上方的内部箭头。管道左侧的是循环体。@Sebastian Redl,你能将你的注释移动到回答部分吗?如果你只是想连接两个l首先,您可以执行[1,2]+[]
,这将生成预期的[1,2]
{1,2]中的每个x:{3]中的每个y:yield(x:ys)}
{3]中的每个y:yield(1:ys)};{3[]中的每个y:yield(2:ys)}
={2:yield>{3:yield(2:ys)}{
=无
。结果中的ys不是列表。请尝试ys
[x:ys | x<-[1,2], ys<-[]]
==
do { x<-[1,2] ; do { ys<-[] ; return (x:ys) } }
==
{ for each x in [1,2]: { for each ys in []: yield (x:ys) } }
==
{ { for each ys in []: yield (1:ys) }
; { for each ys in []: yield (2:ys) }
}
==
{ { for none: yield ... } ; { for none: yield ... } }
==
{ none ; none }
==
none.
join [ {- for 1: -} [ a,b,c ], [ 1a, 1b, 1c,
{- for 2: -} [ d,e ], = 2d, 2e,
{- for 3: -} [ f,g,h,i ], 3f, 3g, 3h, 3i
] ]