Pipes.Aeson ライブラリは、次の関数を公開します。
decode :: (Monad m, ToJSON a) => Parser ByteString m (Either DecodingError a)
このパーサーとファイル ハンドルを引数として evalStateT を使用すると、1 つの JSON オブジェクトがファイルから読み取られて解析されます。
問題は、ファイルに複数のオブジェクト (すべて同じタイプ) が含まれており、それらを読み取るときに折りたたむか縮小したいことです。
Pipes.Parse は以下を提供します。
foldAll :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Parser a m b
しかし、ご覧のとおり、これは新しいパーサーを返します。最初のパーサーを引数として指定する方法が思い浮かびません。
パーサーは実際には StateT モナド変換子のプロデューサーのようです。StateT からプロデューサーを抽出して、evalStateT を foldAll パーサーに適用し、プロデューサーをデコード パーサーから抽出する方法はないかと考えました。
ただし、これはおそらく完全に間違ったアプローチです。
簡単に言えば、私の質問:
Pipes.Aeson を使用してファイルを解析する場合、ファイル内のすべてのオブジェクトを折りたたむ最良の方法は何ですか?