gpt4 book ai didi

haskell - 使用 “staircasing” 代码中的 `Maybe` 值重构 `IO`

转载 作者:行者123 更新时间:2023-12-02 12:19:04 25 4
gpt4 key购买 nike

以下函数f尝试通过使用IO(也许是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

有没有好的方法来重构这段代码?如果我将其扩展到三次尝试,这将变得非常棘手......

(我的思考过程:看到这个“楼梯”告诉我也许我应该使用 MaybeMonad 实例,但是因为它已经在 >IO monad,那么我就必须使用 MaybeT(?)。但是,我只需要 一个readInt 来成功,所以 Maybe monad 在第一个 Nothing 上出错的行为在这里是错误的......)

最佳答案

您可以使用 MaybeTMonadPlus 实例来使用 msum:

f :: MaybeT IO Int
f = msum [readInt, readInt, readInt]

关于haskell - 使用 “staircasing” 代码中的 `Maybe` 值重构 `IO`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com