Apple docs的第5.3章注释:
直观地说,正是这种能力使用了之前的输出 用于决定接下来运行哪些计算的计算使Monad成为可能 比Applicative更强大。
这个例子向我展示了这种直觉:
ghci> Just 100 >>= (\x -> if (x == 100) then Nothing else Just x)
Nothing
我不知道(或根据上述说明可能会发生这种情况)如何使用(<*>)
来实现相同的上述代码。
是否有其他更精确/更强大的例子在Typeclassopedia中展示了上述文字?
答案 0 :(得分:4)
不是一个真实的例子,但您正在寻找的确切属性是您无法编写join :: Applicative f => f (f a) -> f a
,但如果您将约束更改为Monad
,则可以编写它。事实上,如果您只是将此功能添加到应用程序中,它会立即变得像Monad一样强大,因为您可以定义return = pure
和m >>= f = join (fmap f m)
。
我不记得最重要的是加入法律的地方,但它主要是像join (return (return a)) == return a
这样的常识。