66

注: 私は Scala 2.8 を使用していますが、問題になる可能性はありますか?

関数をorfoldと同じように使用できないのはなぜですか?foldLeftfoldRight

Set scaladocには、次のように書かれています。

折り畳みの結果は、この並列コレクションの type parameter のスーパータイプのみである可能性がありますT

Tしかし、関数シグネチャに型パラメーターがありません。

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1

foldLeft-Rightとの違いは何foldですか? 後者はどのように使用すればよいですか?

編集:たとえば、リスト内のすべての要素を追加する折り畳みをどのように記述しますか? foldLeftそれは次のようになります。

val foo = List(1, 2, 3)
foo.foldLeft(0)(_ + _)

// now try fold:
foo.fold(0)(_ + _)
>:7: error: value fold is not a member of List[Int]
  foo.fold(0)(_ + _)
    ^
4

7 に答える 7

77

簡潔な答え:

foldRight右に結合します。つまり、要素は右から左の順序で蓄積されます。

List(a,b,c).foldRight(z)(f) = f(a, f(b, f(c, z)))

foldLeft左に関連付けます。つまり、アキュムレータが初期化され、要素が左から右の順序でアキュムレータに追加されます。

List(a,b,c).foldLeft(z)(f) = f(f(f(z, a), b), c)

fold要素が一緒に追加される順序が定義されていないという点で連想的です。つまり、モノイドfoldを形成するための引数です。

于 2011-06-06T16:28:15.197 に答える
57

foldfoldRightは、および とは異なりfoldLeft、コレクションの要素が処理される順序について保証を提供しません。おそらく、より制約されたシグネチャを持つ を並列コレクションで使用することをお勧めしますfold。ここでは、処理順序が保証されていないため、並列コレクションがフォールディングを並列に実装するのに役立ちます。署名を変更する理由も同様です。追加の制約により、平行折りを作成する方が簡単です。

于 2011-06-06T15:11:40.033 に答える
11

古いバージョンの Scala が問題であることについては、あなたの言うとおりです。Scala 2.8.1 のscaladoc ページを見ると、折り畳みが定義されていないことがわかります (これはエラー メッセージと一致しています)。どうやら、foldScala 2.9 で導入されました。

于 2011-06-08T21:34:37.150 に答える
3

特定の例では、foldLeft と同じ方法でコーディングします。

val ns = List(1, 2, 3, 4)
val s0 = ns.foldLeft (0) (_+_) //10
val s1 = ns.fold (0) (_+_) //10
assert(s0 == s1)
于 2011-06-06T18:25:00.390 に答える