こんにちは。
意図せず関数モナドのインスタンスを利用していることで混乱しているようですね。
実はモナドの m
には (->) x
を入れる事ができ、m a
は x -> a
となることができるのです。
質問の例について、型を順番に追いかけてみましょう。(>>=)
の型は m a -> (a -> m b) -> m b
で、これに Just :: x -> Maybe x
を適用するわけなので、まずは m a
に x -> Maybe x
を当てはめることを考えます。
とすれば、このとき a
は Maybe x
に、m
は (->) x
になるわけですね。
これを (>>=)
の残りの型に当てはめると、(a -> m b)
は (Maybe x -> (x -> b))
、m b
は (x -> b)
になります。
というわけで、(>>=) Just
の型は (Maybe x -> x -> b) -> x -> b
であり、 x
を a
に読み替えれば質問に書かれた型になるわけです。
これにさらに pure :: a -> f a
を適用することを考えます。(Maybe x -> x -> b)
に当てはめるには、a
は Maybe x
となり、f
は (->) x
なので、pure
は (Maybe x -> x -> Maybe x)
となります。
これにより、(>>=) Just
の b
は Maybe x
であることがわかるので、最終的に (>>=) Just pure
の型は x -> Maybe x
に決定します。
0 コメント