比方說,我有很多的功能:「反向」
f :: a -> Maybe a
g :: a -> Maybe a
h :: a -> Maybe a
而且我想他們撰寫以下列方式:若f返回任何計算克如果g返回Nothing,則計算h。如果他們中的任何一個計算Just a,則停止鏈。而整個作品(例如f)當然應該返回Maybe a。
這與Maybe monad的典型用法相反,如果返回Nothing則通常停止計算。
鏈式計算這樣的Haskell成語是什麼?
比方說,我有很多的功能:「反向」
f :: a -> Maybe a
g :: a -> Maybe a
h :: a -> Maybe a
而且我想他們撰寫以下列方式:若f返回任何計算克如果g返回Nothing,則計算h。如果他們中的任何一個計算Just a,則停止鏈。而整個作品(例如f)當然應該返回Maybe a。
這與Maybe monad的典型用法相反,如果返回Nothing則通常停止計算。
鏈式計算這樣的Haskell成語是什麼?
mplus
正是你要找的東西,這MonadPlus
類型類的一部分。下面是它的定義:
instance MonadPlus Maybe where
mzero = Nothing
Nothing `mplus` ys = ys
xs `mplus` _ys = xs
要在您的情況下使用它:
combined x = (f x) `mplus` (g x) `mplus` (h x)
我猜你的意思是:
f,g,h:: a -> Maybe b
使用MonadPlus
f x `mplus` g x `mplus` h x
您可能需要使用StateT單子:
F,G,H是ReaderT一個也許b(達到ReaderT)
或使用MSUM:
function = runReaderT $ msum $ map ReaderT [f,g,h]
mplus
可能是更好的,但這應該工作以及:
import Data.List
import Data.Maybe
import Control.Monad
join $ find isJust [f x, g y, h z]
替代(模擬的應用型函子)也可以,因爲'(<|>)'與Maybe的'mplus'相同。 – 2011-04-09 19:51:47
或者你可以使用Data.Generics.Aliases.orElse – Landei 2011-04-09 22:12:58