"$ ./propellor --list-fields"产生"propellor: Prelude.read: no parse"



我正在尝试使用Haskell的螺旋桨部署库来指定一个私有字段。

作为上下文:所讨论的字段是一个文件,我想在部署过程中加密我要加密的内容并在目标服务器上放置螺旋桨。但是,我还没有走那么远。甚至在尝试设置该字段之前,我在尝试简单地查看螺旋桨当前的私有字段时就遇到了错误。

具体来说,当我运行命令以查看字段,$ ./propellor --list-fields时,它要求我的GPG键,打印一些GPG密钥信息,然后以下内容:

Currently set data:
Field                                     Context                     Used by
-----                                     -------                     -------
propellor: Prelude.read: no parse

应该有一些以前设置的字段,但是以某种方式没有在此处显示,相反,我只收到propellor: Prelude.read: no parse错误消息。我尚未尝试添加自己的领域。

看来,螺旋桨在试图解析某些东西的问题,但我不知道那会是什么。我意识到这并不是很多事情要做,但不确定该怎么办。在Haskell的螺旋桨之前,是否有人遇到了类似的错误或知道问题可能是什么?

您的自我答复是正确的;在这里,我将以不同的方式看这个问题。

您获得的错误指向Prelude中的read函数。 read部分函数的示例:它的类型...

read :: Read a => String -> a

...说它可以使用Read实例将String s转换为任何类型的a的值;但是,我们知道这对所有String s都不起作用,因为解析可能会失败。更明显地说, read 的类型是lie

通常是一个好主意),也是因为它们倾向于发出极其不知情的错误消息(正如您刚刚注意到的)。例如,在read的情况下,一个更好的选择是readMaybe,如果解析失败,它将返回Nothing。这有机会对失败做出反应。例如,在情况下,您可能会发现要求用户重试,提供默认值或没有其他诉讼的情况是适当的尝试做。

对不起,这个问题是如此模糊,但是从错误消息中几乎没有什么可持续的。现在问题已经解决,这是一个解释,以防万一对遇到类似错误的任何人都有帮助。

代码包含未在模块中定义的配置数据类型的实例,而是通过读取类读取的文本文件。简而言之,问题是我已经更改了数据类型而没有全面更新文本定义的配置实例以适应类型更改。

在解释的长色版本中,问题更偷偷摸摸,涉及将数据类型合并到更改对文本配置的更改,而文本配置的变化由于没有线路冲突而未被认为是冲突中的。

,但从本质上讲,错误是未能在文本形式定义的数据类型实例中读取。

我有计划在模块中定义配置数据实例,而不是从文本中读取,该实例应由编译器捕获,并在出现类似错误时给出更有意义的错误消息。

最新更新