代码之家  ›  专栏  ›  技术社区  ›  abhillman

也许莫纳德和>>=

  •  0
  • abhillman  · 技术社区  · 11 年前

    的类型签名 >>= 如下所示:

    (>>=) :: 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 ?

    1 回复  |  直到 11 年前
        1
  •  3
  •   kosmikus    11 年前

    类型 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 可以解释为 也许b ).