Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何为管道实现“parsec”?_Haskell - Fatal编程技术网

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项目
满足
,以及一个通用的
解析
。哦,在你走得太远之前,你应该看看是否对你有帮助。