[Scala]foldLeft(/:)
「/:」という物が何か知りたくて調べてたら、これは
foldLeftのエイリアスだと知った。
で、foldLeftというのは、何かというと、
Rubyでいうとinjectみたいなもの?
rubyのinjectは
[ruby][2, 3, 4, 5].inject(0) {|result, item| result + item}[/ruby]
と書くと、2 + 3 + 4 + 5 の結果が返ってくる
要は、0を初期値として、リストのアイテムごとにブロックで指定した処理をして、戻り値としてresultを返すという物だ
これをScalaで書くと
[scala]val list = List(2, 3, 4, 5)
list.foldLeft(0){(result, item) => result + item}[/scala]
となる
で、このfoldLeftのエイリアスとして「/:」があるのだが
「/:」を使うと
[scala](0 /: list)(_+_)[/scala]
と書くことが出来る
ずいぶん暗号っぽくなってしまうが、これを読み解くと
/:の「:」というのはメソッド名の終端に「:」が付く物は右結合となり、右側から解釈されるので
/:というのはlistのインスタンスメソッドと言うことになる
そう考えると、foldLeftを/:で置き換えた。というイメージがしやすいと思う。
あと、foldLeftという名前の通り、リストの左から処理を実行する。
逆に右から処理を実行させたい場合
[scala]list.foldRight(0){(result, item) => result + item}[/scala]
とかく、この場合のエイリアスは「:\」
:\での書き方も若干変わって
[scala](list :\ 0)(_+_)[/scala]
となる。