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' = (<|>)