Monad vs Applicative for Reader resp.(( - >)a)

use*_*823 6 monads haskell

在Haskell中,函数的monad实例只给出了什么样的应用程序?看看它们的实现,它们看起来几乎相同:

(<*>) f g x = f x (g x)
(>>=) f g x = g (f x) x
Run Code Online (Sandbox Code Playgroud)

你有什么可以做的>>=,你不能只做<*>吗?

Dav*_*vid 10

它们在功能实例中具有相同的功效: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
Run Code Online (Sandbox Code Playgroud)