>>=
的类型签名如下:
(>>=) :: 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
是否有用?
答案 0 :(得分:3)
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) id
要使Just 1
属于Maybe (Maybe b)
类型,Maybe b
必须位于Num
中(因为1
可以解释为Maybe b
)