Haskell “高效”;解析器a->;ByteString->;[a] ";作用

Haskell “高效”;解析器a->;ByteString->;[a] ";作用,haskell,attoparsec,Haskell,Attoparsec,对于已创建的Attoparsec解析器的所有匹配项,解析大文本内容(300K+)的最有效方法是什么 我编写了一个性能缓慢的代码,如下所示: import Data.Either (rights) findAll :: Parser a -> String -> [a] findAll parser = rights . map (parseOnly parser . pack) . oneLess where oneLess []

对于已创建的Attoparsec解析器的所有匹配项,解析大文本内容(300K+)的最有效方法是什么

我编写了一个性能缓慢的代码,如下所示:

import Data.Either (rights)

findAll :: Parser a -> String -> [a]
findAll parser = rights . map (parseOnly parser . pack) . oneLess where
                        oneLess []           = []
                        oneLess (whole@(_:xs)) = whole : oneLess xs
这是针对字符串的,但我认为最好是使用ByteStrings


解析“abba”中的“abba”应该只返回一个匹配项[“abba”],即在匹配后继续。是的,
ByteString
Text
几乎总是比
String
更好的选择。但是知道为什么你的代码很慢是很有用的?记忆被填满了吗?另外,如果您使用模块中的函数
parseOnly
,您的函数将变成
findAll::Parser a->ByteString->[a]
,只需稍加修改。如果您想在恒定内存下执行它,请使用管道或导管。为了澄清,如果您有一个解析
“abba”
的解析器和一个输入字符串
“abababba”
,您希望
findAll
返回
[“abba”,“abba”]
?@cdk,理想情况下它应该只返回[“abba”],也就是说,当匹配模式在整个匹配之后继续时。不清楚“整个匹配”是什么意思。如果我有解析“abba”和输入字符串“abababba”的解析器,它应该返回[“abba”]。如果输入字符串为“ababaabba”,则应返回[“abba”,“abba”]。