[英]'join' for Applicatives?
我正在尋找以下功能:
Applicative f => f (fa) -> fa
Hoogle讓我join
:
>:t join
join :: Monad m => m (m a) -> m a
有沒有符合我想要的簽名的功能?
為了擴展卡爾的答案 ,如果有join
這樣的事情,但對於應用程序:
class Applicative f => ApplicativeWithJoin f where
join' :: f (f a) -> f a
然后你會自動擁有一個monad:
instance ApplicativeWithJoin m => Monad m where
return = pure
x >>= f = join' (f <$> x)
沒有這樣的功能。 join
明確是Applicative
缺乏的和Monad
擁有的。
擴展SingleNegationElimination的答案:
Applicative
的<*>
允許您將效果組合在一起並將它們的值組合在一起,或者使用<$>
操作一個值,但是您不能使效果取決於先前計算的值。 Monad
s允許效果由先前計算的結果確定,如>>=
。 對於任何Applicative
您可以先使用<$>
將a
內部fa
類型a
值轉換為某個fb
,這樣你就得到f (fb)
。 但是沒有join
,內部fb
只是另一個值,沒有辦法將它與實際執行的外部結合起來。 添加join
使其成為可能,允許定義Monad
的全部功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.