的类型签名 >>= 如下所示:
>>=
(>>=) :: 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返回一些错误,因为id上的类型签名是 (a -> a) 与 Monad m => (a -> m b) .
(a -> a)
Monad m => (a -> m b)
有没有一个很好的方法来了解这里发生了什么?有什么用吗 (>>=) (Just 1) id ?
(>>=) (Just 1) id
类型 id 是 c -> c (使用不同的字母,以免与 a 和 b 发生在 >>= ). 我们可以统一 c->c 具有 a -> Maybe b 如果我们选择 c = a = Maybe b .
id
c -> c
a
b
c->c
a -> Maybe b
c = a = Maybe b
这意味着 >>= 在您的示例中,用于类型:
(>>=) :: Maybe (Maybe b) -> (Maybe b -> Maybe b) -> Maybe b
现在你有了
对于 Just 1 类型 Maybe (Maybe b) , Maybe b 必须在中 Num (因为那时 1 可以解释为 也许b ).
Just 1
Maybe (Maybe b)
Maybe b
Num
1
也许b