Haskell 如何为管道实现“parsec”?
我编写了一个Haskell 如何为管道实现“parsec”?,haskell,Haskell,我编写了一个管道,它生成一个项目流。这些项目有一个定制的类型(比如说记录),每个项目都包含一些结构化数据。我正在尝试编写一个下游管道,它解析记录-流 有趣的是,我发现包中的许多概念在我的应用程序中是有意义的。例如,我有时希望许多满足特定谓词的记录排成一行,或者可能我希望某个特定记录的一个实例正好在另一个特定记录的后面。因此,我正在寻找一些方法来重新实现那些用于conducts的函数,例如 satisfy :: Monad m => (r -> Bool) -> ConduitM
管道
,它生成一个项目流。这些项目有一个定制的类型(比如说记录
),每个项目都包含一些结构化数据。我正在尝试编写一个下游管道
,它解析记录
-流
有趣的是,我发现包中的许多概念在我的应用程序中是有意义的。例如,我有时希望许多满足特定谓词的记录排成一行,或者可能我希望某个特定记录的一个实例正好在另一个特定记录的后面。因此,我正在寻找一些方法来重新实现那些用于conduct
s的函数,例如
satisfy :: Monad m => (r -> Bool) -> ConduitM r a m rp
many :: Monad m => ConduitM r a m rp -> ConduitM r a m [rp]
sepBy :: Monad m => ConduitM r a m rp -> ConduitM r a m sep -> ConduitM r a m [rp]
在上面的例子中,它专门处理这些问题
satisfy :: (Record -> Bool) -> ConduitM Record () IO Record
many :: ConduitM Record () IO Record -> ConduitM Record () IO [Record]
sepBy :: ConduitM Record () IO Record -> ConduitM Record () IO Record -> ConduitM Record a IO [Record]
因此,我可以编写简洁的代码,如:
parserC :: Sink Record IO (Record, [Record], [Record])
parserC = do
red <- satisfy isRecordRed
blues <- many $ satisfy isRecordBlue
assorted <- anyRecord `sepBy` satisfy isRecordPurple
return (red, blues, assorted)
parserC::接收器记录IO(记录,[Record],[Record])
parserC=do
红色不,没有办法使parsec
做任何事情都流畅<另一方面,code>attoparsec
有一个很好的接口。不要错过parseWith
函数,这可能是您在大多数情况下都希望运行解析器的方式(它可以让您避免担心部分结果)。@dfeuer:谢谢。我正在研究使用attoparsec
的可能性Data.Attoparsec.Combinator
似乎很有前途,因为它是通用的,但是,parseWith
位于Data.Attoparsec.ByteString
中,因此仅限于ByteString
。欢迎您编写自己的解析库。那太棒了!我不知道现在有没有什么可以做的。即使不使用attoparsec
解析器,泛型组合符也很有用。@dfeuer:仔细研究函数的实现之后,我认为这是可能的。我需要重新实现advance
(内部),peek项目
,满足
,以及一个通用的解析
。哦,在你走得太远之前,你应该看看是否对你有帮助。