Haskell命令行脚本应如何报告“读取”中的错误?

时间:2018-11-01 16:02:49

标签: haskell error-handling command-line-interface user-experience

对于read命令行中的用户输入,我不确定从main = do ...创建实例来报告错误的正确方法。

具体地说,我有一个constructor可以验证其参数并以通常的方式报告错误

-- ...
Right cfg  -> cfg
Left err -> error (show err)

以及使用此构造函数的read的实现。但是,在我的实现中,我有一个cryptic note(继承自我很久以来的一些长期研究),可以删除错误信息

instance Read ... where
        readsPrec _ i = case ...
            Right cfg  -> [(cfg, "")]
            Left _ -> [] -- Loses error information, but conforms to specification of 'readsPrec' in 'Read'

这样my command line parser

main :: IO ()
main = do
    ... read

仅将

报告由构造函数生成的所有错误。
Prelude.read: no parse

如果我忽略了我的神秘评论和instead have

Left err -> error (show err)

在构造函数中,然后我将完整的错误信息报告给用户:

script: Detailed error information here
  CallStack (from HasCallStack):
  error, called at ./Pkg/Module.hs:371:57 in main:Pkg.Module

(尽管具有堆栈和行信息,但我不想在此情况下报告)。

所以我对此有三个相关的问题:

  1. 实际上是否有任何理由不使用read报告来自Left err -> error (show err)的完整错误信息?
  2. 如果这样并且在那里需要Left err -> []之类的东西,我该如何在命令行报告read或构造函数错误?

和(不那么重要)

  1. read中的main = do ...进行报告时,如何摆脱堆栈信息?

1 个答案:

答案 0 :(得分:0)

  1. 是:纯代码无法捕获error调用。从纯代码中知道read(好吧,reads)失败通常很有用。
  2. 使用与Read不同的类进行解析,以便更清楚地报告错误。每个流行的解析器-合并器库都具有用于良好错误报告的功能。
  3. 使用虚构的errorWithoutStackTrace