gpt4 book ai didi

haskell - 如何处理多级缩进?

转载 作者:行者123 更新时间:2023-12-03 08:31:22 26 4
gpt4 key购买 nike

我正在编写一个具有逻辑上非常复杂的循环的脚本:

main = do
inFH <- openFile "..." ReadMode
outFH <- openFile "..." WriteMode

forM myList $ \ item ->
...
if ...
then ...
else do
...
case ... of
Nothing -> ...
Just x -> do
...
...

代码很快就向右飞了,所以我想把它分成几部分,例如使用 where 子句。问题是,其中许多 ... 包含对两个句柄 inFHoutFH 的读/写语句,并使用 where 语句将在上下文之外呈现这两个名称。每次使用 where 语句时,我都必须发送这两个变量。

有没有更好的方法来处理这个问题?

最佳答案

在许多情况下,这些嵌套很深的缩进是嵌套很深的错误检查的结果。如果这对你来说是这样,你应该研究一下 MaybeT 和它的老大哥 ExceptT。这些提供了一种清晰的方法来将“出现问题时我们做什么”代码与“假设一切正常我们做什么”代码分开。在你的例子中,我可能会写:

data CustomError = IfCheckFailed | MaybeCheckFailed

main = handleErrors <=< runExceptT $ do
inFH <- liftIO $ openFile ...
outFH <- liftIO $ openFile ...
forM myList $ \item -> do
when (...) (throwError IfCheckFailed)
...
x <- liftMaybe MaybeCheckFailed ...
...

liftMaybe :: MonadError e m => e -> Maybe a -> m a
liftMaybe err = maybe (throwError err) return

handleErrors :: Either CustomError a -> IO a
handleErrors (Left err) = case err of
IfCheckFailed -> ...
MaybeCheckFailed -> ...
handleErrors (Right success) = return success

请注意,我们仍然在 forM 循环中增加了缩进;但其他检查在 main 中“在线”完成,并在 handleErrors 中以相同的缩进级别进行处理。

关于haskell - 如何处理多级缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39913349/

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