【发布时间】:2014-05-17 18:28:37
【问题描述】:
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 解析器,以及来自 decode Parser 的 Producer。
这可能是完全错误的方法。
我的问题,简而言之:
使用 Pipes.Aeson 解析文件时,折叠文件中所有对象的最佳方法是什么?
【问题讨论】:
标签: json parsing haskell aeson haskell-pipes