![](/img/trans.png)
[英]Generic function that accepts two monadic values and returns a single monadic value
[英]a generic monadic `(<|>)`?
我正在尋找一種更簡潔/慣用的getAorB
編寫getAorB
:
getAorB = do
a <- getA
case a of
Just _ -> return a
Nothing -> getB
這已經作為庫功能存在嗎?
請注意, liftM2 (<|>) getA getB
與:
do a <- getA
b <- getB
return $ a <|> b
這與getAorB
不同,因為即使getA
返回Just
總是在getB
調用bind。
您可以使用其默認值的maybe
函數 ( b -> (a -> b) -> Maybe a -> b
):
getAorB :: Monad m => m a
getAorB = getA >>= maybe getB return
我認為沒有一個函數可以在任何地方執行此操作。
在imo上嘗試使用Alternative (例如MaybeT )效果不佳,因為它也認為第二個操作也是容易犯錯的,而getB
是。 如果是這樣,則應考慮使用MaybeT
:
getAorB :: Monad m => m (Maybe a)
getAorB = runMaybeT $ MaybeT getA <|> MaybeT getB
對於MaybeT
mplus
, MaybeT
聽起來像是一個MaybeT
。
由於(<|>)從應用程序獲得了它的能力,這不是不可能嗎? 感覺就像您要尋找的類型是
Monad m => a ->[m (Maybe a)] -> m a
代替? 或者可能
Monad m => a -> (a -> Bool) -> [m a] -> m a
Hoogle都不給我任何東西。
隱藏所有變壓器:
import Control.Monad.Trans.Maybe
getAOrB :: m (Maybe a) -> m (Maybe a) -> m (Maybe a)
getAOrB getA getB = runMaybeT (MaybeT getA <|> MaybeT getB)
但是我可能只是在所有地方都使用MaybeT
:
getAOrB' :: MaybeT m a -> MaybeT m a -> MaybeT m a
getAOrB' = (<|>)
請注意,此類型與第一個實現的類型略有不同。 它具有與第二種實現相同的類型,但行為更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.