以下函数
有没有一种好的方法来重构这段代码?如果我将其扩展到三次尝试,这将变得非常棘手...
(我的思考过程:看到这个“阶梯状”,让我想到也许我应该使用
f
尝试通过两次使用IO (Maybe Int)
函数来读取Int
,但在成功读取一个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
有没有一种好的方法来重构这段代码?如果我将其扩展到三次尝试,这将变得非常棘手...
(我的思考过程:看到这个“阶梯状”,让我想到也许我应该使用
Maybe
的Monad
实例,但由于这已经在IO
单子中,因此我接下来需要使用MaybeT
(?)。然而,我只需要一个的readInt
成功,因此Maybe
单子的错误行为在第一个Nothing
上失败这点是不正确的...)
IO (Maybe Int)
计算包装在MaybeT
构造器中。 - Gabriella Gonzalez