b2oxさんの知恵袋

度々,超・有り難い助言(コメント)を下さる,Haskellerのb2oxさん.今回,関数結合(.)で悩んでた際により高いハードルを設けてくれたり,普通に役に立つヒントを与えてくれたりで,本当に嬉しかったので,コメント欄を引用し,自分用のメモついでにまとめます.


なお,ボクはホントにかいつまむので,より詳しい内容は関数適用の左結合性 - もちを参照の事.引用さしてもらってるコメントは,そこから.

関数の規則

  1. f (g x) = (f . g) x
  2. f . g = (.) f g
  3. a b c = (a b) c
  4. a x = b x ⇔ a = b
  5. 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の後の数字は引数の個数.

中置演算子の部分適用

中置演算子の部分的用は演算子の左側だけでなく右側に対してもある.

(. g) f = f . g = (f .) g

が成り立つ.

総括

う〜ん,ためになる,そして手に取るように分かる.ので,引用先コメント欄はマジオススメ.この記事書きながら,さらに理解を深めました.b2oxさんに感謝.