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
            ]                                                 ]