簡體   English   中英

通用單子詞((|||))?

[英]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 mplusMaybeT聽起來像是一個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.

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