2

私は「ファンクショナルプログラミング入門」を読んでいます。 私はここに連結を理解していないどのように `[e | x < - xs; y < - ys; ...] =連結[[e | y < - ys; ...] | x < - xs> `

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

、として理解を変換するルールについて来ました。 concatは複数のリストを取りますが、ここでは1つしか表示されません。

私はたぶん私はそれが間違って読んでいますか|ここにいくつかの特別な意味を持つ。

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

として[[e | y <- ys; ...] | x <- xs]を読みます

助けてください。あなたの疑似言語に翻訳

+0

'連結:: [] - > [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]式を読むことができる:「xs内のすべてのxys内のすべてのyためeで構成され、リストを生成するために」。

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

関連する問題