【问题标题】:Monad More Powerful than Applicative [duplicate]Monad 比 Applicative 更强大
【发布时间】:2015-09-17 01:38:29
【问题描述】:

Typeclassopedia的第5.3章笔记:

直观地说,正是这种能力使用了先前的输出 计算来决定接下来要运行什么计算,这使得 Monad 比 Applicative 更强大。

这个例子向我展示了这种直觉:

ghci> Just 100 >>= (\x -> if (x == 100) then Nothing else Just x) 
Nothing

我不知道(或者根据上面的解释期望它是可能的)如何使用(<*>) 来实现相同的,上面的代码。

还有其他更精确/有力的例子可以证明 Typeclassopedia 中的上述文本吗?

【问题讨论】:

标签: haskell


【解决方案1】:

并不是一个真正的示例,但您正在寻找的确切属性是您不能编写 join :: Applicative f => f (f a) -> f a 但如果您将约束更改为 Monad 则可以编写它。事实上,如果你只是将这个函数添加到应用程序中,它会立即变得像 Monad 一样强大,因为你可以定义 return = pure 和 m >>= f = join (fmap f m)。

我不记得在哪里加入的法律是什么,但这主要是常识性的东西,比如join (return (return a)) == return a。

【讨论】:

  • 确实是常识:join . return = id、join . fmap return = id 和 join . fmap join = join . join。
猜你喜欢
  • 2016-04-28
  • 2013-09-06
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2012-11-12
  • 2016-04-22
  • 2014-06-14
相关资源
最近更新 更多