gpt4 book ai didi

haskell - "try"回溯了多远?

转载 作者:行者123 更新时间:2023-12-02 16:51:20 28 4
gpt4 key购买 nike

所以...我弄乱了 CSV 格式的录音:

23,95489,0,20,9888

由于语言设置, float 是用逗号作为分隔符编写的...在逗号分隔值文件中...

问题是该文件没有为每个浮点提供良好的格式。有些根本没有意义,而且意义后面的数字个数也各不相同。

我的想法是构建一个 MegaParsec 解析器,它会尝试读取所有可能的浮点格式,继续前进,如果发现错误则返回。

例如上面的例子:

  1. 阅读 23,95489 -> 很好
  2. 阅读 0,20 -> 良好(到目前为止)
  3. 读取 9888 -> 错误(因为列的值太高(由 guard 检查))
  4. (返回到 2。)读取 0 -> 再次正常
  5. 阅读 20,9888 -> 很好
  6. 完成

我已将其实现为(此处为伪代码):

floatP = try pointyFloatP <|> unpointyFloatP

lineP = (,,) <$> floatP <* comma <*> floatP <* comma <*> floatP <* comma

我的问题是,显然 try 仅适用于“当前” float 。没有回溯到之前的位置。这是正确的吗?

如果是这样......我将如何实现进一步的回溯?

最佳答案

How far does “try” back track?

如果p解析成功,解析器try p消耗的输入与p完全相同,否则它根本不消耗任何输入。因此,如果您从回溯的角度来看,它会回溯到您调用它时所在的位置。

My problem is that apparently the try only works in the 'current' float. There is no backtracking to previous positions. Is this correct?

是的,try 不会“取消消耗”输入。它所做的只是从您提供的解析器的故障中恢复,而不消耗任何输入。它不会撤消您之前应用的任何解析器的效果,也不会影响您在 try p 成功后应用的后续解析器。

And if so ... how would I go about implementing further back tracking?

基本上,您想要的不仅是知道 pointyFloatP 在当前输入上是否成功,而且还知道 lineP 的其余部分在成功 pointyFloatP 后是否会成功 - 如果没有,您想回溯到应用 pointyFloatP 之前。所以基本上你需要 try 中整个剩余行的解析器,而不仅仅是浮点解析器。

要实现这一点,您可以使 floatP 将剩余行的解析器作为参数,如下所示:

floatP restP = try (pointyFloatP <*> restP) <|> unpointyFloatP <*> restP

请注意,这种回溯不会非常有效(但我假设您知道这一点)。

关于haskell - "try"回溯了多远?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483393/

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