【发布时间】:2015-02-12 07:37:44
【问题描述】:
>>= 的类型签名如下:
(>>=) :: 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)。
有没有很好的方法来了解这里发生了什么? (>>=) (Just 1) id有什么用吗?
【问题讨论】:
-
注意
m >>= id等同于join m,并且join具有签名Monad m => m (m a) -> m a,这可能会有所帮助。 -
你需要更多的括号:
(>>=) (Just 1) $ id应该是一样的。 -
@abhillman
(>>=) Just 1 $ id不与(>>=) (Just 1) id相同。后者是您上面的示例,并将您在问题中列出的类型与join示例的类型进行比较。 -
id可以有任何返回类型,包括单子类型。 -
1可以解释为Num的任何类型,但理论上,该类型也可以是Monad的实例。跨度>