Haskell 一个通用的单子“(<;|>;)”?

Haskell 一个通用的单子“(<;|>;)”?,haskell,monads,Haskell,Monads,我正在寻找一种更简洁/惯用的写作方式getAorB: getAorB = do a <- getA case a of Just _ -> return a Nothing -> getB getAorB=do 报答 无->获取 这是否已经作为库函数存在于某个地方 注意liftM2()getA getB与: do a <- getA b <- getB return $ a <|> b 做一个,因为()从app

我正在寻找一种更简洁/惯用的写作方式
getAorB

getAorB = do
  a <- getA
  case a of
    Just _  -> return a
    Nothing -> getB
getAorB=do
报答
无->获取
这是否已经作为库函数存在于某个地方

注意
liftM2()getA getB
与:

do a <- getA
   b <- getB
   return $ a <|> b
做一个,因为()从applicative获得了它的能力,这不是不可能吗?
感觉你要找的类型是

Monad m => a ->[m (Maybe a)] -> m a
相反?或许

Monad m => a -> (a -> Bool) -> [m a] -> m a
Hoogle也没有给我任何东西。

您可以使用(
b->(a->b)->也许a->b
)的默认值:

getAorB :: Monad m => m a
getAorB = getA >>= maybe getB return
我认为没有一个函数可以在任何地方实现这一点

在这里,尝试使用(例如)并不能很好地工作,因为它认为第二个操作也容易出错,而您的
getB
则不然。如果是,你应该考虑使用<代码> MaybeT < /> >:

getAorB :: Monad m => m (Maybe a)
getAorB = runMaybeT $ MaybeT getA <|> MaybeT getB
getAorB::Monad m=>m(可能是a)
getAorB=runMaybeT$MaybeT getA MaybeT getB

听起来像是
mplus
用于
MaybeT
隐藏所有变压器:

import Control.Monad.Trans.Maybe

getAOrB :: m (Maybe a) -> m (Maybe a) -> m (Maybe a)
getAOrB getA getB = runMaybeT (MaybeT getA <|> MaybeT getB)

请注意,此类型与第一个实现的类型略有不同;它的类型与第二个实现相同,但性能更好。

它应该是
getAorB=getA>=maybe getB(return.Just)
@AaditMShah:No,
getB
不返回
maybe
另一种可能性:
加入$fmap(maybe getB(return.Just))getA
@user5402:Uh,
加入。fmap
=
>=
?@Bergi:
:t\getA getB->do{a return a;Nothing->getB}
返回
m(Maybe t)->m(Maybe t)->m(Maybe t)->m(Maybe t)
。所以,是的,
getB
确实返回了一个
可能
getAOrB' :: MaybeT m a -> MaybeT m a -> MaybeT m a
getAOrB' = (<|>)