GenTraversable の fold が結合法則を満たさなければならない理由

タイトルに関する言い訳

みずしまさんに突っ込まれて、その後のtwitter上でのやり取りもあったので、下に追記したよ!


上記のような理由があるので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上でやりとりあったので、ここから追記

*1: 言い換えると、「普通のcollectionだけを使いたい人」にとっては、foldとfoldLeftという同じような2つのメソッドがあるのは、混乱の元になるだけである