首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在haskell的attoparsec或parsec

在haskell的attoparsec或parsec
EN

Stack Overflow用户
提问于 2013-10-06 11:12:49
回答 1查看 11.4K关注 0票数 79

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

Haskell似乎为此提供了两套方案:

  1. 阿托帕秒
  2. 帕秒

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-06 19:54:49

帕秒

Parsec对于“面向用户”的解析器是很好的:在输入量有限但错误信息重要的地方。它不是特别快,但如果你有小的投入,这不重要。例如,我会选择Parsec作为几乎任何编程语言工具,因为--从绝对意义上说--即使是最大的源文件也没有那么大,但是错误信息真的很重要。

Parsec可以处理不同的输入类型,这意味着您可以将其用于标准的String或来自某种类型的外部lexer的令牌流。因为它可以使用String,所以它可以很好地处理Unicode;内置的基本解析器(如digitletter )可以识别Unicode。

Parsec还附带了一个monad转换器,这意味着您可以在一个单一堆栈中对其进行分层。例如,如果您希望在解析期间跟踪其他状态,这可能非常有用。你也可以获得更多的绊脚石效果,比如不确定的解析,或者别的什么--通常单台变压器的魔力。

阿托帕塞特

Attoparsec比Parsec快得多。当您期望获得大量的输入或性能时,您应该使用它。它非常适合网络代码(解析数据包结构)、解析大量原始数据或处理二进制文件格式。

Attoparsec可以使用ByteStrings,后者是二进制数据。这使得它成为实现二进制文件格式的一个很好的选择。但是,因为这是二进制数据,所以它不处理文本编码之类的事情;为此,您应该为Text使用attoparsec模块。

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

与Parsec相比,Parsec有更糟糕的错误消息,并且为了性能牺牲了一些高级别的功能。它是专门用于TextByteString的,因此您不能将它与来自自定义lexer的令牌一起使用。它也不是单台变压器。

哪个?

最终,Parsec和Attoparsec迎合了非常不同的细分市场。高层次的差异在于性能:如果需要,选择Attoparsec;如果不需要,只需使用Parsec即可。

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

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

正如您所看到的,选择实际上非常简单:用例不太重叠。很有可能,在任何给定的应用程序中使用哪个应用程序都是非常清楚的。

票数 148
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19208231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档