{-# LANGUAGE OverloadedStrings #-}
import Data.Attoparsec.Text
import Control.Applicative(many)
import Data.Word
parseManyNumbers :: Parser [Int] -- I'd like many to return a Vector instead
parseManyNumbers = many (decimal <* skipSpace)
main :: IO ()
main = print $ parseOnly parseManyNumbers "131 45 68 214"
上面只是一个例子,但是我需要在 Haskell 中解析大量的原始值,并且需要使用数组而不是列表。这在F# 的 Fparsec中是可能的,所以我已经研究了 Attoparsec 的源代码,但我想不出办法。事实上,我无法弄清楚Haskell 库中many
从哪里Control.Applicative
定义的。base
我认为它会在那里,因为那是关于 Hackage 的文档指向的地方,但没有这样的运气。
另外,我在决定在这里使用什么数据结构时遇到了麻烦,因为我在 Haskell 中找不到像可调整大小的数组那样方便的东西,但我宁愿不使用效率低下的基于树的结构。
我的一个选择是跳过 Attoparsec 并在 ST monad 中实现整个解析器,但我宁愿避免它,除非作为最后的手段。