在Haskell中,monad函数实例只给出了什么样的应用程序?看看它们的实现,它们看起来几乎相同:
(<*>) f g x = f x (g x)
(>>=) f g x = g (f x) x
>>=
是否可以使用<*>
无法做到的事情?
答案 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