[英]Haskell: How to report validation errors from command line arguments to user with proper exit codes
我正在使用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 动作实际上没有返回(但退出整个程序),它的类型可以是任何 a 的IO a
a
声称它可以适合任何类型。
然后,您的main
代码应该按原样工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.