ログ日記

作業ログと日記とメモ

関数合成演算子

.の扱いが分からない・・。
コメントを貰ったんだけどぱっと見で動きが理解できなかった。

f :: (b -> c) -> (a -> b) -> a -> c
f g h = g . h

f :: (b -> c) -> (a1 -> a -> b) -> a1 -> a -> c
f g h = (g .) . h

f :: (b -> c) -> (a2 -> a1 -> a -> b) -> a2 -> a1 -> a -> c
f g h = ((g .) .) . h

うーん。関数合成は

. :: (b -> c) -> (a -> b) -> a -> c

こうなので・・

f :: (b -> c) -> (a -> b) -> a -> c
f g = (g .)

これは (.) g と同義で・・・
そもそも

f1 g = (g .)
f2 g h = g . h

これは . と同じ事なのか。

f g h = (.) g . h
      = ((.) g .) h
      = ((g .) .) h -- // (g .) = (.) g

というのは分かった。が・・今度は関数合成演算子で頭がぐるぐる。
セクションに慣れないとダメかぁ。
4 / 2 => (4 /) 2
これがすぐ思い付けば簡単だったんだな。

f g h a b = g (h a b)
f g h a b = g $ h a b
f g h a = g . h a
f g h a = (g .) $ h a
f g h = (g .) . h

こう機械的に変更出来ても・・数学で公式だけ覚えて意味を理解していない状況みたいな感じだ。
あとこういうふうに一行一行書いたら分かるけど、f g h = (g .) . h だけ見てぱっと分かるかどうか・・慣れの問題かな。