誰かがどのようにいくつかの例を提供できますか
実は慣れ?reduce / fold メソッドへのショートカットだと思いますが、Scala ドキュメントで実際にどのように使用されるかについての例はなく、Google で検索したり StackOverflow で検索したりすることはできません。
個人的にはandの/:
and:\
の形が好きです。2 つの理由:foldLeft
foldRight
コレクションの左/右に値をプッシュして関数を適用していることがわかるため、より自然な感じになります。あれは
(1 /: ints) { _ + _ }
ints.foldLeft(1) { _ + _ }
どちらも同等ですが、前者は何が起こっているかについての私の直感を強調していると思いがちです. これがどのように起こっているのか (つまり、メソッドがコレクションではなく値 1 で呼び出されているように見える)を知りたい場合は、コロンで終わるメソッドが右結合であるためです。::
これは、標準ライブラリの他の場所にある+:
などで 見ることができます。
パラメータの順序はFunction2
、折り畳まれた要素と折り畳まれた要素と同じ順序です。
(b /: as) { (bb, a) => f(bb, a) }
// ^ ^ ^ ^
// ^ ^ ^ ^
// B A B A
以下よりもあらゆる点で優れています。
as.foldLeft(b) { (bb, a) => f(bb, a) }
これは、適切な IDE がサポートされる前の時代では、はるかに重要な違いだったことは認めますが、現在では、IDEA は単純な CTRL-P で期待される機能を教えてくれます。
foldRightがどのように機能するかも明らかであることを願ってい:\
ます。値が右側から押し込まれているように見えることを除いて、基本的にはまったく同じです。私は、foldRight
それがどのように実装されているか (つまり、間違っている) のために、私は in scala をよく避ける傾向があると言わなければなりません。
/:
foldLeft
との同義語:\
ですfoldRight
。
ただし、 makeはその右側のオブジェクトに適用されることを:
覚えておいてください。/:
が と(_ * _)
同等の無名関数で(a, b) => a * b
あり、foldLeft と foldRight のシグネチャが
def foldLeft [B] (z: B)(f: (B, A) ⇒ B): B
def foldRight [B] (z: B)(f: (A, B) ⇒ B): B
つまり、開始値を取得するカリー化された関数と、開始値/アキュムレータをリストの項目と組み合わせた関数です。いくつかの例を次に示します。
List(1,2,3).foldLeft(1)(_*_)
これはと同じです
(1 /: List(1,2,3))(_*_)
と
List(1,2,3).foldRight(1)(_*_)
中置表記では
(List(1,2,3) foldRight 1)(_*_)
これはと同じです
(List(1,2,3) :\ 1)(_*_)
独自のコレクションと機能を追加してお楽しみください!
短い (/:
および:\
) 表記で覚えておくべきことは、中置表記を使用しているため、2 番目の引数リストを適切に取得するために、最初の部分を括弧で囲む必要があるということです。また、foldLeft と foldRight の関数は逆であることを覚えておいてください。
Rex Kerrは、フォールドについての良い答えをここに書いています。終わり近くに、foldLeftとfoldRightのショートカット構文の例を見ることができます。