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