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

时间:2014-03-05 23:45:16

标签: haskell monads

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

(<*>) f g x = f x (g x)
(>>=) f g x = g (f x) x

>>=是否可以使用<*>无法做到的事情?

1 个答案:

答案 0 :(得分: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