gpt4 book ai didi

haskell - haskell中的attoparsec或parsec

转载 作者:行者123 更新时间:2023-12-03 05:23:56 24 4
gpt4 key购买 nike

我必须解析一些文件并将它们转换为一些预定义的数据类型。

Haskell 似乎为此提供了两个包:

  1. attoparsec
  2. parsec

这两者之间有什么区别,哪一个更适合根据某些规则解析文本文件?

最佳答案

秒差距

Parsec 对于“面向用户”的解析器很有用:输入数量有限但错误消息很重要的情况。它不是很快,但如果你的输入很小,这应该不重要。例如,我会为几乎所有编程语言工具选择 Parsec,因为从绝对意义上来说,即使是最大的源文件也没有那么大,但错误消息确实很重要。

Parsec 可以处理不同的输入类型,这意味着您可以将它与标准 String 或来自某种外部词法分析器的标记流一起使用。由于它可以使用String,因此它可以完美地为您处理 Unicode;内置的基本解析器(例如 digitletter)可以识别 Unicode。

Parsec 还附带了一个 monad 转换器,这意味着您可以将其分层到一个 monad 堆栈中。例如,如果您想在解析期间跟踪其他状态,这可能很有用。您还可以寻求更多迷幻效果,例如非确定性解析或其他东西 - monad 转换器的常见魔力。

阿托秒差距

阿托秒差距比秒差距快得多。当您期望获得大量输入或性能确实很重要时,您应该使用它。它非常适合网络代码(解析数据包结构)、解析大量原始数据或处理二进制文件格式等。

Attoparsec 可以使用ByteString,它们是二进制数据。这使得它成为实现二进制文件格式等内容的不错选择。但是,由于这是针对二进制数据的,因此它不处理文本编码之类的事情;为此,您应该对 Text 使用 attoparsec 模块。

Attoparsec 支持增量解析,而 Parsec 不支持。这对于某些应用程序(例如网络代码)非常重要,但对于其他应用程序来说并不重要。

Attorparsec 的错误消息比 Parsec 更糟糕,并且为了性能牺牲了一些高级功能。它专门用于 TextByteString,因此您不能将它与自定义词法分析器中的标记一起使用。它也不是一个 monad 转换器。

哪一个?

最终,Parsec 和 Attoparsec 迎合了截然不同的领域。高层差异是性能:如果需要,请选择 Attoparsec;如果你不这样做,就选择秒差距。

我通常的启发是选择 Parsec 作为编程语言、配置文件格式和用户输入,以及几乎所有我用正则表达式做的事情。这些通常是手工生成的,因此解析器不需要扩展,但它们确实需要很好地报告错误。

另一方面,我会选择 Attoparsec 来实现网络协议(protocol)、处理二进制数据和文件格式或读取大量自动生成的数据。您要处理时间限制或大量数据的事情,这些数据通常不是由人类直接编写的。

如您所见,选择实际上通常非常简单:用例不会太多重叠。对于任何给定的应用程序,很可能会很清楚使用哪一个。

关于haskell - haskell中的attoparsec或parsec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208231/

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