gpt4 book ai didi

haskell - Haskell命令行脚本应如何报告 `read`中的错误?

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

我不确定通过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

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

因此,我对此有三个相关的问题:
  • 实际上是否有任何理由不使用read报告Left err -> error (show err)中的完整错误信息?
  • 如果是这样,并且那里需要Left err -> []之类的东西,如何在命令行中报告read或构造函数错误?

  • 和(不那么重要)
  • read中的main = do ...报告时,如何摆脱堆栈信息行?
  • 最佳答案

  • 是:纯代码无法捕获error调用。从纯代码中知道read(好吧,reads)已失败通常很有用。
  • 使用与Read不同的类进行解析,可以使您更清楚地报告错误。每个流行的解析器-合并器库都具有良好的错误报告功能。
  • 使用想象中的errorWithoutStackTrace
  • 关于haskell - Haskell命令行脚本应如何报告 `read`中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53104972/

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