Scala Vector Fold Syntax( /:and: and /:)
質問
誰かがその方法についていくつかの例を提供できますか
実際に使用されますか?削減 /折りたたみ方式のショートカットだと思いますが、Scalaドキュメントで実際にどのように使用されるかについての例はありません。
解決
/:
の同義語です foldLeft
と :\
為に foldRight
.
しかし、それを覚えておいてください :
作る /:
その右側のオブジェクトに適用します。
あなたがそれを知っていると仮定する (_ * _)
同等の匿名関数です (a, b) => a * b
, 、そして、折り畳みと折りたたみの署名がそうです
def foldLeft [B] (z: B)(f: (B, A) ⇒ B): B
def foldRight [B] (z: B)(f: (A, B) ⇒ B): B
IEは、開始値とスタート値 /アキュムレータをリストのアイテムと組み合わせた関数を取得しているカレー化関数です。例には次のようなものがあります。
List(1,2,3).foldLeft(1)(_*_)
これは同じです
(1 /: List(1,2,3))(_*_)
と
List(1,2,3).foldRight(1)(_*_)
Infixでは表記法です
(List(1,2,3) foldRight 1)(_*_)
これは同じです
(List(1,2,3) :\ 1)(_*_)
独自のコレクションや機能を追加して楽しんでください!
短いことで覚えておくべきこと(/:
と :\
)表記は、2番目の引数リストを適切にピックアップするために、最初の部分の周りに括弧を付ける必要があるInfix表記を使用しているためです。また、折りたたみと折り畳み式の機能は反対の方法であることを忘れないでください。ただし、頭の折り目を視覚化する場合は理にかなっています。
他のヒント
私は個人的に好みます /:
と :\
の形 foldLeft
と foldRight
. 。 2つの理由:
あなたがコレクションの左/右に値を押して関数を適用していることがわかるので、それはより自然な感触を持っています。あれは
(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サポートの前の時代のはるかに重要な違いであったことを認めていますが、最近では単純なCTRL-Pでどのような機能が期待されるかを教えてくれます
それがどのように明らかになることを願っています :\
Foldrightで動作します - それは基本的にまったく同じですが、値が右側から押し込まれているように見えることを除いて。私は言わなければならない、私はよく逃げる傾向がある foldRight
Scalaでは、それがどのように実装されているか(つまり、誤って)。
Rex Kerrは、折り目について素晴らしい答えを書いています ここ. 。端近くに、折りたたみと折り畳み式のショートカット構文の例を見ることができます。