【问题标题】:Maybe Monad and >>=也许 Monad 和 >>=
【发布时间】: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 的实例。跨度>

标签: haskell monads maybe


【解决方案1】:

id 的类型是c -> c(使用不同的字母以免与>>= 类型中出现的ab 冲突)。如果我们选择c = a = Maybe b,我们可以将c -> ca -> Maybe b 统一起来。

所以这意味着您的示例中的>>= 用于类型:

(>>=) :: Maybe (Maybe b) -> (Maybe b -> Maybe b) -> Maybe b

现在你有

(>>=)    (Just 1)           id

如果Just 1Maybe (Maybe b) 类型,Maybe b 必须在Num 中(因为这样1 可以解释为Maybe b)。

【讨论】:

  • 谢谢,@kosmikus。有没有一个好地方可以阅读关于统一类型的信息?我对这个概念不太熟悉。
  • 另外,那么说1 被解释为monad 是否正确?
  • @abhillman 取决于您想要获得的理论和透彻程度。 Pierce 的“类型和编程语言”非常好和透彻。但是,如果您正在寻找更随意的介绍,您可能只想看看 Haskell 书籍。
  • @abhillman 我认为这是一个误导性的陈述。 1 的类型是 Num t => t。因此,文字可以解释为属于Num 类的任何类型。您在示例中使用 1 类型为 Maybe b。这就是为什么要求Maybe b 出现在Num 中的原因(通常不成立)。这与 Maybe 也是一个 monad 无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2019-02-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多