怎么样`[e | x< - xs; y< - ys; ...] = concat [[e | y< - ys; ......] | x< - xs]`

时间:2017-10-12 06:33:13

标签: javascript haskell functional-programming list-comprehension

我正在阅读"功能编程简介第一版"。 我找到了将理解翻译为的规则,

[e | x <- xs; y <- ys; ...] = concat[[e | y <- ys; ...] | x <- xs]

我不明白concat在这里。 concat需要多个列表,但在这里我只看到一个。

我将[[e | y <- ys; ...] | x <- xs]视为

for(x in xs){
 for(y in ys){
  someList.push(e)
 }
}

也许我读错了或|在这里有一些特殊含义。

请帮忙。

1 个答案:

答案 0 :(得分:2)

翻译成您的伪语言的

[[e | y <- ys; ...] | x <- xs]将是:

for (x in xs) {
    tmp = []
    for (y in ys) {
        tmp.push(e)
    }

    someList.push(tmp)
}

您可以将[[e | y <- ys; ...] | x <- xs]表达式视为:&#34;对于x中的每个xs,每e生成一个包含y的列表} ys&#34;。

concat具有以下签名:concat :: [[a]] -> [a]

所以它展开了折叠的结构。

因此concat [[1,2,3],[4,5]] =&gt; [1,2,3,4,5]