以下函数f
尝试Int
通过使用IO (Maybe Int)
函数两次读取 an ,但在成功读取 one 后“短路”执行Int
:
readInt :: IO (Maybe Int)
f :: IO (Maybe Int)
f = do
n1 <- readInt
case n1 of
Just n' -> return (Just n')
Nothing -> do
n2 <- readInt
case n2 of
Just n' -> return (Just n')
Nothing -> return Nothing
有没有重构这段代码的好方法?如果我将其扩展到 3 次尝试,这将变得非常棘手……</p>
(我的思考过程:看到这个“楼梯”告诉我也许我应该使用 的Monad
实例Maybe
,但是由于这已经在IO
monad 中,所以我必须使用MaybeT
(?)。但是,我只需要一个readInt
to成功,所以Maybe
单子第一次Nothing
出错的行为在这里是错误的......)