(.f)は定義域を書き換えると思ってみる。
用語の使い方が雑ですが、、、。
理解したかったこと
Prelude> :t Data.Char.chr Data.Char.chr :: Int -> Char
のときに
Prelude> :t (. Data.Char.chr) (. Data.Char.chr) :: (Char -> c) -> Int -> c
となる理由がよくわからなかったのでメモ。
考え方
g :: b -> c
があったときに、gのドメインをbからaに書き換えることを考える。結果的に a -> c
としたい。
そのために、 a -> b
を gより先に使うと書き換えができる。
(b -> c) -> (a -> b)
とすれば、 aがキャンセルされて a -> c
となり、ドメインを入れ替えることができる。
これは、関数合成そのもの。
Prelude> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c
見方を変えて、「ドメインを書き換える」ものをつくりたい。
関数合成の第2パラメータの関数をあらかじめ用意しておく。
f :: a->b
とすると。(. f)
がそれに相当する。
つまり、 (.f)
は、「ある関数のドメインを書き換える」関数という見方ができる(と思う)。
図解してみる
以下の図のgに着目して、gのドメインを書き換えたいと思ってみると良いはず。