Using the Maybe Monad in “reverse”

↘锁芯ラ 提交于 2019-12-03 09:20:53

mplus is exactly what you're looking for, part of the MonadPlus typeclass. Here's its definition:

instance MonadPlus Maybe where
   mzero = Nothing

   Nothing `mplus` ys  = ys
   xs      `mplus` _ys = xs

To use it in your case:

combined x = (f x) `mplus` (g x) `mplus` (h x) 

mplus is probably better, but this should work as well:

import Data.List
import Data.Maybe 
import Control.Monad 

join $ find isJust [f x, g y, h z]

I guess you mean:

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

Using MonadPlus

f x `mplus` g x `mplus` h x

You might want to use the StateT Monad:

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

f,g,h are ReaderT a Maybe b (up to the ReaderT)

or using msum:

function = runReaderT $ msum $ map ReaderT [f,g,h]
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!