繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM