在“反向”中使用Maybe Monad

假设我有许多function:

f :: a -> Maybe a g :: a -> Maybe a h :: a -> Maybe a 

我想用下面的方式来编写它们:如果f返回Nothing,则计算g。 如果g返回Nothing,则计算h。 如果他们中的任何一个计算Just a,则停止链。 而整个作品(例如f)当然应该返回Maybe a。

这与Maybe monad的典型用法相反,如果返回Nothing则通常停止计算。

链式计算这样的Haskell成语是什么?

mplus正是你正在寻找的, MonadPlustypes的一部分。 这是它的定义:

 instance MonadPlus Maybe where mzero = Nothing Nothing `mplus` ys = ys xs `mplus` _ys = xs 

要在你的情况下使用它:

 combined x = (fx) `mplus` (gx) `mplus` (hx) 

mplus可能会更好,但这也应该工作:

 import Data.List import Data.Maybe import Control.Monad join $ find isJust [fx, gy, hz] 

我想你的意思是:

 f,g,h:: a -> Maybe b 

使用MonadPlus

 fx `mplus` gx `mplus` hx 

您可能想要使用StateT Monad:

 function = runReaderT $ ReaderT f `mplus` ReaderT g `mplus` ReaderT h 

f,g,h是ReaderT a也许b(达到ReaderT)

或使用msum:

 function = runReaderT $ msum $ map ReaderT [f,g,h]