読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

(.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のドメインを書き換えたいと思ってみると良いはず。

f:id:naotoogawa:20151228215201p:plain