242*_*684 4 haskell composition monad-transformers
我正在处理一个库(ghcjs-dom),其中每个函数返回一个IO (Maybe T).
我有一个函数a返回an IO (Maybe x)和函数b,它x作为参数并返回一个IO (Maybe y).
是一个允许我做a ??? b和获得的运营商IO (Maybe y).我的Hoogle搜索没有任何结果.
我正在寻找类似的东西join,IO (Maybe (IO (Maybe t)))而不是IO (IO t)或Maybe (Maybe t).
Eri*_*ikR 10
根据我的理解,你有:
a :: IO (Maybe X)
b :: X -> IO (Maybe Y)
Run Code Online (Sandbox Code Playgroud)
IO (Maybe a)和之间存在密切关系MaybeT IO a,即将MaybeT一个转换为另一个:
MaybeT :: IO (Maybe a) -> MaybeT IO a
Run Code Online (Sandbox Code Playgroud)
而逆操作只是runMaybeT:
runMaybeT :: MaybeT IO a -> IO (MaybeT a)
Run Code Online (Sandbox Code Playgroud)
在MaybeT monad中,您要执行的组合只是绑定操作:
MaybeT a >>= (\x -> MaybeT (b x)) :: MaybeT IO Y
Run Code Online (Sandbox Code Playgroud)
这会产生类型的值MaybeT IO Y.将其转换回正常IO (Maybe Y)使用runMaybeT.
更新
这是一个"撰写" a和b的运算符:
andThen :: IO (Maybe a) -> (a -> IO (Maybe b)) -> IO (Maybe b)
andThen a b = runMaybeT $ MaybeT a >>= (\x -> MaybeT (b x) )
Run Code Online (Sandbox Code Playgroud)
但是,如果你发现自己经常使用这个操作符,也许你应该修改你的函数,这样你主要在MaybeT IO
monad中工作,然后你可以
在外面使用>>=一个单独runMaybeT的.