gpt4 book ai didi

Haskell:如何使用正确的退出代码向用户报告命令行参数的验证错误

转载 作者:行者123 更新时间:2023-12-05 03:22:13 27 4
gpt4 key购买 nike

我正在使用 getOpt 来解析和验证 getArgs 提供的参数。

我选择对 getOpt 使用基于操作的方法,这里是类型。

data Options = Options { afield :: foo, bfield :: bar}
type Action = Either String (Options -> Options)

然后我使用默认选项记录折叠操作列表,

evaluateActions :: Either [String] Options -> Action -> Either [String] Options
evaluateActions (Left errors) (Left err) = Left $ err:errors
evaluateActions (Left errors) (Right _) = Left errors
evaluateActions (Right _) (Left err) = Left [err]
evaluateActions (Right option) (Right action) = Right $ action option

之后,我得到了所需的类型 Either [String] Options。出现错误时,我想打印出字符串并退出,错误代码为 InvalidArgument。

printErrorsThenExit :: [String] -> ExitCode -> IO ()
printErrorsThenExit errs code =
hPutStr stderr (concat errs) >>
exitWith code

我正在努力在我的主要功能中将其粘合在一起,而没有编写如下不适用于类型的内容:

opts <- case result of
Left errors -> printErrorsThenExit errors illegalArgument
Right options -> return options

我看过 when 函数,但我认为它没有帮助,因为我需要解包 Either。

有人知道我如何在 Haskell 中表达失败过程吗?

最佳答案

因为我们有

exitWith :: ExitCode -> IO a 

您只需将 printErrorsThenExit 类型更改为

printErrorsThenExit :: [String] -> ExitCode -> IO a
-- ^ --

要点是:如果一个 IO 操作实际上没有返回(但退出整个程序),它的类型可以是 IO a 对于任何 a,声称它可以适合任何类型。

您的 main 代码应该可以正常工作。

关于Haskell:如何使用正确的退出代码向用户报告命令行参数的验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72778073/

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