首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解attoparsec

了解attoparsec
EN

Stack Overflow用户
提问于 2010-08-28 00:05:44
回答 1查看 2.8K关注 0票数 5

有人建议我使用attoparsec来解析文件,现在我必须了解如何使用它;有人给了我这段代码:

代码语言:javascript
复制
type Environment = M.Map String String 
import Data.Attoparsec (maybeResult)
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Char8 as B
environment :: A.Parser Environment
environment = M.fromList <$> A.sepBy entry A.endOfLine
parseEnvironment = maybeResult .flip A.feed B.empty . A.parse environment
spaces = A.many $ A.char ' '
entry = (,) <$> upTo ':' <*> upTo ';'
upTo delimiter = B.unpack <$> A.takeWhile (A.notInClass $ delimiter : " ")
                      <* (spaces >> A.char delimiter >> spaces)

这非常有效,但我不知道为什么:使用翻转的原因是什么,以不同的顺序放置A.feed的参数不是更容易吗?为什么会有B.empty呢?有没有可以学习的教程?提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-28 00:33:28

在对this StackOverflow question的回答中有对feed需求的解释。正如Bryan O‘’Sullivan(Attoparsec的创建者)所说:

如果您编写的attoparsec解析器在失败之前消耗了尽可能多的输入,那么当您到达输入的末尾时,您必须告诉部分结果continuation。

您可以通过向它提供一个空的bytestring来做到这一点。

我承认这段代码是我写的,在这种情况下,我实际上并没有使用pointfree。在这里,简单的组合对我来说很有意义:运行解析器(A.parse environment),告诉它已经完成(flip A.feed B.empty),然后将其转换为Maybe,作为一种基本的错误处理(maybeResult)。在我看来,这比直接的版本更干净:

代码语言:javascript
复制
parseEnvironment b = maybeResult $ A.feed (A.parse environment b) B.empty

剩下的我认为是相当惯用的applicative parsing,尽管我不确定为什么我要使用>>而不是*>

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

https://stackoverflow.com/questions/3586069

复制
相关文章

相似问题

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