const id
constとconst 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 -> a
のa
をc -> 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->c
をe
に当てはめて、第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になるのはなぜだろう。。。