2

我在阅读“功能编程第一版简介”。 我来约规则翻译理解为,`[e |如何? x < - xs; y < - ys; ...] = concat [[e | y < - ys; ...] x < - xs]`

[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) 
} 
} 

也许我读错了或|这里拥有一些特殊的意义。

请帮忙。

+0

'的concat :: [[α]] - >并[a]'。 'concat [[e | y < - ys; ...] x < - xs]'---在这里你得到一个列表清单,然后展开到一个平面列表。 – zerkms

回答

3

[[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]表达为:“对于xsx产生由eysy列表”。

concat具有以下特征:concat :: [[a]] -> [a]

所以,展开折叠结构。

因此concat [[1,2,3],[4,5]] =>[1,2,3,4,5]

+0

我读错了,谢谢! – Abhishek

+0

@Abhishek Javascript的'concat'在Haskell中是'(++)',它的类型为[[a] - > [a] - > [a]'。但是,在JS中,阵列当然不一定是同类的。 – ftor

相关问题