有與類似的簽名功能:
a -> IO (m b)
b -> IO (m c)
c -> IO (m d)
如何把它們連在
a -> IO (m d)
屬屬l,你可能無法。例如,如果m
是Const
,我不確定問這甚至是有道理的。一般而言,您可能預期m
爲Monad
。但是,請注意,即使m
是 a Monad
,其與IO
的組合可能不是(see this)。
Value1 -> IO (Maybe Value2)
Value2 -> IO (Maybe Value3)
Value3 -> IO (Maybe Value4)
啊,現在你說!您在這裏尋找的抽象是MaybeT
和Kleisli組合(>=>)
。然後,例如,
import Control.Monad ((>=>))
import Control.Monad.Trans.Maybe (MaybeT(..))
rest1 :: Value1 -> IO (Maybe Value2)
rest2 :: Value2 -> IO (Maybe Value3)
rest3 :: Value3 -> IO (Maybe Value4)
rest4 :: Value1 -> IO (Maybe Value4)
rest4 x = runMaybeT ((MaybeT . rest1 >=> MaybeT . rest2 >=> MaybeT . rest3) x)
這仍然看起來有點難看。要做的事情可能是重構您的rest1
,rest2
和rest3
函數。正如已經在評論MaybeT IO a
中指出的那樣,可以將其轉換爲IO (Maybe a)
(其實這正是runMaybeT
和MaybeT
所做的)。
import Control.Monad ((>=>))
import Control.Monad.Trans.Maybe (MaybeT(..))
rest1 :: Value1 -> MaybeT IO Value2
rest2 :: Value2 -> MaybeT IO Value3
rest3 :: Value3 -> MaybeT IO Value4
rest4 :: Value1 -> MaybeT IO Value4
rest4 = rest1 >=> rest2 >=> rest3
您正在尋找Kliesli組合物'(> =>)'檢查這裏的http:// hackage .haskell.org/package/base-4.9.1.0/docs/Control-Monad.html#v:-62--61--62- – zeronone
此外'IO(也許a)〜MaybeT IO a'和'MaybeT'是在http://hackage.haskell.org/package/transformers-0.5.2.0/docs/Control-Monad-Trans-Maybe.html#v:MaybeT – zeronone