在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)