也许 Monad 和 >>=

Maybe Monad and >>=

>>= 的类型签名如下:

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

以下对我来说很有意义(这也是单子法则之一):

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

然而前奏曲给出了以下内容:

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

我原以为 Prelude return 会出现一些错误,因为 id 上的类型签名是 (a -> a) 而不是 Monad m => (a -> m b).

有什么好的方法可以理解这里发生的事情吗? (>>=) (Just 1) id有什么用吗?

id的类型是c -> c(使用不同的字母,以免与[=16=的类型中出现的ab冲突]).如果我们选择 c = a = Maybe b.

,我们可以将 c -> ca -> 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).