也许Monad和>> =

时间:2015-02-12 07:37:45

标签: haskell monads maybe

>>=的类型签名如下:

(>>=) :: Monad m => m a -> (a -> m b) -> m b

以下内容对我有意义(它也是monad法律之一):

(>>=) (Just 1) (id . return) == Just 1

然而Prelude给出了以下内容:

Prelude> :t (>>=) (Just 1) id
(>>=) (Just 1) id :: Num (Maybe b) => Maybe b

我原本希望Prelude返回一些错误,因为id上的类型签名是(a -> a)而不是Monad m => (a -> m b)

有没有很好的方法来了解这里发生了什么? (>>=) (Just 1) id是否有用?

1 个答案:

答案 0 :(得分:3)

id的类型为c -> c(使用不同的字母,以免与a类型中出现的b>>=冲突。如果我们选择c -> c,我们可以将a -> Maybe bc = a = Maybe b统一起来。

因此,这意味着您的示例中的>>=用于类型:

(>>=) :: Maybe (Maybe b) -> (Maybe b -> Maybe b) -> Maybe b

现在你有了

(>>=)    (Just 1)           id

要使Just 1属于Maybe (Maybe b)类型,Maybe b必须位于Num中(因为1可以解释为Maybe b