也许 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=的类型中出现的a
和b
冲突]).如果我们选择 c = a = Maybe b
.
,我们可以将 c -> 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
).
>>=
的类型签名如下:
(>>=) :: 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=的类型中出现的a
和b
冲突]).如果我们选择 c = a = Maybe b
.
c -> 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
).