haskell - 在 Reader resp 的情况下 Monad vs Applicative。 ((->)一)

标签 haskell monads

在 Haskell 中,函数的 monad 实例仅仅放弃了应用程序吗?查看它们的实现,它们看起来几乎相同:

(<*>) f g x = f x (g x)
(>>=) f g x = g (f x) x
>>= 有什么可以做的吗?你不能只用 <*> ?

最佳答案

对于函数实例,它们的功能是等效的:flip f <*> g == g >>= f .但是,对于大多数作为 Monad 实例的类型来说,情况并非如此。

如果我们比较 <*> 会更清楚一点和 =<< (即 flip (>>=) )专门用于 ((->) r)实例:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
   -- Specialized to ((->) r):
(<*>) :: (r -> a -> b) -> (r -> a) -> r -> b

(=<<) :: Monad m => (a -> m b) -> m a -> m b
   -- Specialized to ((->) r):
(=<<) :: (a -> r -> b) -> (r -> a) -> r -> b

关于haskell - 在 Reader resp 的情况下 Monad vs Applicative。 ((->)一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211876/

相关文章:

list - zip 函数还需要第二个列表,它如何只使用一个参数列表

haskell - 共享一个无点函数,但评估两次

scala - 当嵌套很深时如何处理所有单子(monad)结构?

haskell - fmap和bind之间的能力差异?

haskell - 如何抑制生成代码中的警告?

haskell - 如何在 Haskell 的多播连接中指定源地址?

unit-testing - 模拟 IO 操作 : getArgs and putStrLn

haskell - 了解 Haskell 中的绑定(bind)函数

haskell - 我什么时候想使用 Free Monad + Interpreter 模式?

haskell - 从标准输入到进程的管道