まずは復習、以下の二つの関数:
f : A -> B -> X
f´: A × B -> X
の変換過程はカリー化として知られている。正確には
f´ -> f : curry
f -> f´ : uncurry
となる。
さて、ここでリストに対する基本操作
fold(+,l)
を考えよう。
fold(+,l) ≡ a + b + c + d...
where l = {a, b, c, d...}
ここで、curry braceは(なぜだか)リストを意味するものとする。
注目すべき簡単な例を示す:
fold(+,l) ≡ a + b
where l = {a, b}
ここでHaskellが持つ関数-オペレータ間の変換機能・構文を使って書き直すと、
+ `fold` l = a + b
where l = {a, b}
となるし、さらに部分適用を使ってポイントフリー的な感じに表記し直すと、
(+): A -> B -> C
(+).fold: {A,B} -> C
ということで fold
の話と繋がった: もしA × B
が{A,B}
と同じなら(そのような言語なら)、
fold = uncurry
なんてこった。BQNにハマるまで気づかなかった。