b2oxさんの知恵袋
度々,超・有り難い助言(コメント)を下さる,Haskellerのb2oxさん.今回,関数結合(.)で悩んでた際により高いハードルを設けてくれたり,普通に役に立つヒントを与えてくれたりで,本当に嬉しかったので,コメント欄を引用し,自分用のメモついでにまとめます.
なお,ボクはホントにかいつまむので,より詳しい内容は関数適用の左結合性 - もちを参照の事.引用さしてもらってるコメントは,そこから.
関数の規則
- f (g x) = (f . g) x
- f . g = (.) f g
- a b c = (a b) c
- a x = b x ⇔ a = b
- f . g = (. g) f
こんな感じに宣言したり適応したりできる.
関数をx,yを使わずに表す
そもそもの発端.それは例えば,
h x y = f (g x y)
を,x,yを用いずに定義すること.この場合,
h x y = f ((g x) y) ・・・ 3 h x y = (f . (g x)) y ・・・ 1 ⇔ h x = f . (g x) ・・・ 4 h x = (.) f (g x) ・・・ 2 h x = ((.) f) (g x) ・・・ 3 h x = ((.) f) . g) x ・・・ 1 ⇔ h = ((.) f) . g
となる.また,((.) f) は中置演算子の部分適用を用いて (f .) と書けるので,
h = (f .) . g
と書ける.
よし,これは理解できた.もう友達にも"それとなく"説明するぐらいはできるだろう.
引数の数
上の最後の式は
h = ((f .) . )g
と書く事が出来,そこから規則性が見えてくる.
h1 = (f .) g1 h2 = ((f .) .) g2 h3 = (((f .) .) .) g3
h,gの後の数字は引数の個数.
総括
う〜ん,ためになる,そして手に取るように分かる.ので,引用先コメント欄はマジオススメ.この記事書きながら,さらに理解を深めました.b2oxさんに感謝.