{-# 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
fromControl.Applicative
が定義されている場所がわかりません。base
Hackage のドキュメントが指し示している場所なので、そこにあると思いましたが、そのような運はありません。
また、Haskell でサイズ変更可能な配列ほど便利なものが見つからないため、ここで使用するデータ構造を決定するのに苦労していますが、効率の悪いツリー ベースの構造は使用したくありません。
Attoparsec をスキップして ST モナド内にパーサー全体を実装するという選択肢もありますが、最後の手段以外では避けたいと思います。