如何处理IO(Maybe(IO(Maybe t)))类型?

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.

更新

这是一个"撰写" ab的运算符:

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的.