[英]Reactive's Monad and Applicative instances in Conal Elloit's FRP
[英]Implementing Applicative's (<*>) for Monad
Applicative
的具有(<*>)
功能:
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
了解您的Haskell顯示以下功能。
鑒於:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap f m = do
g <- f -- '<-' extracts f's (a -> b) from m (a -> b)
m2 <- m -- '<-' extracts a from m a
return (g m2) -- g m2 has type `b` and return makes it a Monad
怎么能ap
與寫bind
獨自一人,即>>=
?
我不知道如何提取(a -> b)
從m (a -> b)
也許一旦我理解了<-
如何用do notation
,我就會理解上述問題的答案。
怎么能用bind單獨寫,即>> =?
這是我可以提出的一個示例實現:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap xs a = xs >>= (\f -> liftM f a)
如果您不想使用liftM
那么:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap mf ma = mf >>= (\f -> ma >>= (\a' -> return $ f a'))
最初這些是類型:
mf :: m (a -> b)
ma :: m a
現在,當你將bind( >>=
)運算符應用於mf
: mf >>= (\\f-> ...
, f
的類型為:
f :: (a -> b)
在下一步中, ma
也應用>>=
: ma >>= (\\a'-> ...
,這里a'
的類型為:
a' :: a
所以,現在當你應用f a'
,你會從中得到類型b
,因為:
f :: (a -> b)
a' :: a
f a' :: b
並且你應用return
f a'
,它將用monadic層包裝它,因此你得到的最終類型將是:
return (f a') :: m b
因此,所有的東西都會出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.