为已经创建的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
它适用于String,但我认为最好的是ByteStrings。
在“abbabba”中解析“abba”应该只返回一个匹配[“abba”],即匹配后再继续。