みずしまさんに突っ込まれて、その後のtwitter上でのやり取りもあったので、下に追記したよ!
ウオーーッ scala の GenTraversable#fold 今まで foldl1 のつもりで使ってたけど "a binary operator that must be associative" と書いてあるヨ???歳納さん、歳納さんーー
2012-09-15 01:52:51 via web
@lyrical_logical foldってたしか2.8以前は存在しなくて、2.9でparallel collectionが入った関係で追加されたから、そんな感じになっていたとかだったような(だいぶ憶測で言ってるから間違ってるかも)
2012-09-15 02:05:21 via web to @lyrical_logical
.@lyrical_logical URL GenTraversableは、普通のcollectionとparallel collectionの共通の親で、するとparallel collectionの場合は、順番保証されないから(ry
2012-09-15 02:25:55 via web to @lyrical_logical
上記のような理由があるのでHaskellとか他の言語の経験があって、"fold"っていう名前だけ聞いて使い方想像しちゃうとかえって間違いますね・・・。
考えられるのは
GenTraversable型の変数に入ってるあるコレクションがあって(その実態は普通のcollectionかもしれないし、parallel collectionかもしれない)、実行しようとしている畳込みの演算が結合法則を満たすものだったのならば、foldLeftではなく、foldで実行しておいたほうがもし中身がparallel collectionだった場合に並列実行されて便利!
という、あまり無さそうなシチュエーションの場合に一応便利だから、普通のcollectionとparallel collectionの共通の親に定義されているのだと思う。つまり、普通のcollectionとわかっているものに対して、foldで実行しようが、foldLeftで実行しようが、関係ない。*1 実際、2.9.2において、Listのfoldは、単にfoldLeftを呼んでいるだけである。
https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/TraversableOnce.scala#L184
参考ドキュメント
http://docs.scala-lang.org/ja/overviews/parallel-collections/overview.html
たぶん合っていると思うんだけど、この説明間違ってたら誰か突っ込んでください。
突っ込まれて、twitter上でやりとりあったので、ここから追記
@kmizu @xuwei_k ボクが言いたいことは大体言い尽くされてますね…並列とか関係なく、データ構造的に都合のいい方使っていいわけだから、Iterator なら foldLeft、List なら foldRight みたいになっててもおかしくないわけですよね、実際は違うけど
2012-09-15 11:45:32 via web to @kmizu
@lyrical_logical あーなるほど"並列関係なくデータ構造的に都合のいい方使っていい"は確かにその通りというか、自分の説明で明らかに抜けてましたね。実際使い分けたりしてる部分はないのかな…
2012-09-15 11:49:27 via Twitter for iPad to @lyrical_logical
@kmizu @xuwei_k List の fold とか明らかに foldRight のほうが自然なのに foldLeft になってるのは、値は List だけど型は Seq みたいな時に fold が foldRight だとびっくりかもしれないから、ですかね。
2012-09-15 11:50:37 via web to @kmizu
StackOverflow でまさにそれっぽい質問あったけど、そこまですごく詳しく回答書いてあるわけでもないな URL Difference between fold and foldLeft or foldRight?
2012-09-15 12:11:33 via web
@lyrical_logical @xuwei_k ScalaだとfoldRightのデフォルト実装はスタックの消費が大きいっつうのがありそうな 。
2012-09-15 16:07:11 via Twitter for Android to @lyrical_logical
*1: 言い換えると、「普通のcollectionだけを使いたい人」にとっては、foldとfoldLeftという同じような2つのメソッドがあるのは、混乱の元になるだけである