簡體   English   中英

為Monad實現Applicative(<*>)

[英]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( >>= )運算符應用於mfmf >>= (\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM