エラー。fold
の署名では、コレクション内の値の型のスーパータイプである型の折りたたみ値のみが許可され、String
(コレクション型) およびInt
(提供されたゼロの型) の唯一のスーパータイプであるため、コンパイル時エラーが発生します。要素)がございAny
ます。したがって、折り畳み結果の型はAny
- であると推測されAny
、メソッドはありませんtoInt
。
の 2 つのバージョンのfold
シグネチャは異なることに注意してください。
fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1
foldLeft[B](z: B)(f: (B, A) => B): B
なぜ彼らは異なる署名を持っているのですか? これはfold
、並列コレクションの場合と同様に、並列で実装できるためです。複数のプロセッサがコレクション内の値をフォールド オーバーする場合、プロセッサのそれぞれが type の要素のサブセットを取得し、連続して を適用することによりA
、type のフォールドされた値を生成します。これらのプロセッサによって生成された結果は、最終的な折り畳み値に結合する必要があります。これは、まさにそれを行う関数を使用して行われます。A1
op
op
f
ここで、これはinを使用して実行できないことに注意してください。これはfoldLeft
、各プロセッサが type の折り畳まれた値を生成するためですB
。型のいくつかの値をB
を使用して結合することはできません。これは、値 を型の別の値とのみ結合するf
ためです。型との間には対応がありません。f
B
A
A
B
例。"1", "2"
あなたの例では、最初のプロセッサが要素を取り、2番目のプロセッサが要素を取ると仮定します"3"
。最初のものは折りたたまれた値を生成3
し、2 番目のものは別の折りたたまれた値を生成します3
。ここで、結果を結合して最終的な折り畳まれた値を取得する必要があります。これは不可能です。クロージャは 2 つの値ではなく、 andの_ + _.toInt
結合方法しか認識していないためです。Int
String
Int
これらの型が異なる状況ではaggregate
、 type の 2 つの値を組み合わせる方法を定義する必要がある を使用しますB
。
def aggregate[B](z: B)(seqop: (B, A) => B, combop: (B, B) => B): B
上記combop
は、折り畳み結果とコレクション内の要素の型が異なる場合の最終ステップの実行方法を定義しています。
ニュートラルな要素。前述のように、複数のプロセッサがコレクション内の要素のサブセットを折りたたむ場合があります。それらのそれぞれは、ニュートラル要素を追加することによって折り畳まれた値を開始します.
次の例では:
List(1, 2, 3).foldLeft(4)(_ + _)
常に戻ります10 = 4 + 1 + 2 + 3
。
ただし、ニュートラルな要素ではないため、 と4
一緒に使用しないでください。fold
List(1, 2, 3).fold(4)(_ + _)
上記は(4 + 1 + 2) + (4 + 3) = 14
またはを返す場合があり(4 + 1) + (4 + 2) + (4 + 3) = 18
ます。にニュートラル要素を使用しない場合fold
、結果は非決定的になります。同様に、をニュートラル要素として使用できますが、Nil
空でないリストは使用できません。