[Scala]foldLeft(/:)

2011年12月9日

/:」という物が何か知りたくて調べてたら、これは

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]
となる。

Scala

Posted by GENDOSU