Pipes.Aeson 库公开了以下函数:
decode :: (Monad m, ToJSON a) => Parser ByteString m (Either DecodingError a)
如果我将此解析器与文件句柄一起使用 evalStateT 作为参数,则会从文件中读取单个 JSON 对象并进行解析。
问题是该文件包含多个对象(所有相同类型),我想在读取它们时折叠或缩小它们。
Pipes.Parse 提供:
foldAll :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Parser a m b
但是正如你所看到的,这会返回一个新的解析器——我想不出一种方法来提供第一个解析器作为参数。
看起来 Parser 实际上是 StateT monad 转换器中的 Producer。我想知道是否有一种方法可以从 StateT 中提取 Producer,以便可以将 evalStateT 应用于 foldAll Parser,以及从 decode Parser 中提取 Producer。
不过,这可能是完全错误的方法。
简而言之,我的问题是:
使用 Pipes.Aeson 解析文件时,折叠文件中所有对象的最佳方法是什么?