IT練習ノート

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

const id

constconst idの違い

Prelude> const 'a' 1
'a'
-- 第1引数を返す

Prelude> (const  id) 'a' 1
1
-- 第2引数を返す

型の確認

const idは第2引数を返すことがわかる。

Prelude> :t const  id
const  id :: b -> a -> a

型の計算

Prelude> :t const
const :: a -> b -> a
Prelude> :t id
id :: a -> a

だから、id :: c -> c と一旦書き直して、const :: a -> b -> aac -> cとみなすと、(c -> c) -> b -> (c -> c)となり、const idで第1引数を使っているので、b -> (c -> c)となり、書き直すと、a -> b -> bとなる。

いろいろ試してみる

const . id(関数合成)

Prelude> :t const . id
const . id :: b -> b1 -> b

となり、constと同じ。

揃えて書いて、上下に並ぶ箇所をキャンセルすると、a -> b -> aとなる。

id    :: a -> a
const ::      a -> b -> a
-------------------------
         a      -> b -> a

const (.id)

Prelude> :t const  (.id)
const  (.id) :: b -> (b1 -> c) -> b1 -> c

の場合は、

Prelude> :t (.id)
(.id) :: (b -> c) -> b -> c

なので、const :: e -> f -> eと書き直して、(b->c)->b->ceに当てはめて、第1パラメータを取ると、f -> (b->c)->b->cとなる。

const . (.id) [これがわからなかった]

Prelude> :t const . (.id)
const . (.id) :: (b1 -> c) -> b -> b1 -> c
(.id) :: (b -> c) -> b -> c
const ::                  c -> d -> c
-------------------------
         (b ->c) -> b -> d -> c

となるはずだけど、dがb1になるのはなぜだろう。。。