我正在阅读"函数式编程导论第一版"。我制定了一个规则,将理解翻译为,
[e | x <- xs; y <- ys; ...] = concat[[e | y <- ys; ...] | x <- xs]
我不明白这里的连接。 concat
需要多个列表,但在这里我只看到一个。
我读[[e | y <- ys; ...] | x <- xs]
为
for(x in xs){
for(y in ys){
someList.push(e)
}
}
也许我读错了,或者|
在这里有一些特殊的含义。
请帮忙。
伪语言[[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]
表达式理解为:"对于xs
中的每个x
,生成一个列表,其中包含ys
中每个y
的e
"。
concat
具有以下签名:concat :: [[a]] -> [a]
所以它展开了折叠的结构。
因此concat [[1,2,3],[4,5]]
=> [1,2,3,4,5]