5
在Haskell中,函数的monad实例给出的仅仅是可应用的?看着他们的实现,他们似乎几乎相同:Haskell monad与函数的应用实例
(<*>) f g x = f x (g x)
(>>=) f g x = g (f x) x
有什么你可以用>>=
,你不能只用<*>
办呢?
在Haskell中,函数的monad实例给出的仅仅是可应用的?看着他们的实现,他们似乎几乎相同: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
我相信没有什么区别,在'((的情况下 - >)一)'和'Reader'(它们是相同的东西),在'Applicative'和'Monad'接口允许的之间。这与大多数类型不同。 – Carl