使用Pipes.Aeson在Haskell中进行JSON的流解析

不变状态

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

但是您可以看到,这将返回一个新的解析器-我想不出将第一个解析器作为参数提供的方法。

看起来解析器实际上是StateT monad转换器中的生产者。我想知道是否存在一种从StateT提取生产者的方法,以便evalStateT可以应用于foldAll解析器,而生产者可以从解码解析器应用。

但是,这可能完全是错误的方法。

简而言之,我的问题是:
使用Pipes.Aeson解析文件时,折叠文件中所有对象的最佳方法是什么?

danidiaz

decode您可以使用的解析镜头代替使用它将的生产者转变为解析的JSON值的生产者。decoded Pipes.Aeson.UncheckedByteString

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Pipes
import qualified Pipes.Prelude as P
import qualified Pipes.Aeson as A
import qualified Pipes.Aeson.Unchecked as AU
import qualified Data.ByteString as B

import Control.Lens (view)

byteProducer :: Monad m => Producer B.ByteString m ()
byteProducer = yield "1 2 3 4"

intProducer :: Monad m => Producer Int m (Either (A.DecodingError, Producer B.ByteString m ()) ())
intProducer = view AU.decoded byteProducer

的返回值intProducer有点吓人,但这仅意味着intProducer以解析错误和错误之后未解析的字节结尾,或者以原始生成方的返回值结尾(()在我们的例子中)。

我们可以忽略返回值:

intProducer' :: Monad m => Producer Int m ()
intProducer' = intProducer >> return ()

并将生产者插入fold的折叠Pipes.Prelude,例如sum

main :: IO ()
main = do
    total <- P.sum intProducer'
    putStrLn $ show total

在ghci中:

λ :main
10

还请注意,这些函数纯粹地和不纯洁地使您可以应用于foldl包中定义的生产者折叠

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Haskell Aeson 解析 Json 玫瑰树

来自分类Dev

使用Aeson从Haskell中的URL解析JSON数据

来自分类Dev

在 Haskell 中使用 Aeson 解析 JSON 配置文件

来自分类Dev

使用 Aeson 解析嵌入的 JSON

来自分类Dev

如何使用Haskell Aeson解析数组

来自分类Dev

使用haskell pipes-bytestring逐行迭代文件

来自分类Dev

使用内置的json库在android中进行JSON解析?

来自分类Dev

使用angularjs在MVC 4 Web API中进行Json解析

来自分类Dev

使用此URL在Swift中进行JSON解析

来自分类Dev

使用哈希键在SQL中进行JSON解析

来自分类Dev

使用Alamofire在Swift 3中进行Json解析

来自分类Dev

如何在使用Data.Aeson进行JSON解析时正确出错

来自分类Dev

如何使用Aeson解析Bitly Response JSON?

来自分类Dev

如何使用Aeson解析此JSON?

来自分类Dev

使用Aeson解析JSON文档时解析引用

来自分类Dev

Aeson使用先前解析的默认值解析JSON

来自分类Dev

使用Aeson解析JSON文档时解析引用

来自分类Dev

Haskell-pipes:如何使用drawAll来测试具有MonadSafe约束的生产者?

来自分类Dev

为什么Haskell Pipes“使用()关闭未使用的输入,使用X(无人居住的类型)关闭未使用的输出”?

来自分类Dev

使用Bing在R中进行地址解析

来自分类Dev

使用domDocument在PHP中进行XML解析

来自分类Dev

使用Argonaut解析JSON流

来自分类Dev

如何使用 Gson 解析深层嵌套 json 对象中的字段并在 android 中进行改造?

来自分类Dev

使用aeson解析JSON以获取复合数据类型

来自分类Dev

使用aeson解析JSON以获取复合数据类型

来自分类Dev

使用流Java 8在List Java中进行修改

来自分类Dev

使用swift在JSON数据中进行循环

来自分类Dev

如何在Haskell / Aeson中使用类型函数解析多态值?

来自分类Dev

使用Haskell从列表中进行传递闭包

Related 相关文章

  1. 1

    使用 Haskell Aeson 解析 Json 玫瑰树

  2. 2

    使用Aeson从Haskell中的URL解析JSON数据

  3. 3

    在 Haskell 中使用 Aeson 解析 JSON 配置文件

  4. 4

    使用 Aeson 解析嵌入的 JSON

  5. 5

    如何使用Haskell Aeson解析数组

  6. 6

    使用haskell pipes-bytestring逐行迭代文件

  7. 7

    使用内置的json库在android中进行JSON解析?

  8. 8

    使用angularjs在MVC 4 Web API中进行Json解析

  9. 9

    使用此URL在Swift中进行JSON解析

  10. 10

    使用哈希键在SQL中进行JSON解析

  11. 11

    使用Alamofire在Swift 3中进行Json解析

  12. 12

    如何在使用Data.Aeson进行JSON解析时正确出错

  13. 13

    如何使用Aeson解析Bitly Response JSON?

  14. 14

    如何使用Aeson解析此JSON?

  15. 15

    使用Aeson解析JSON文档时解析引用

  16. 16

    Aeson使用先前解析的默认值解析JSON

  17. 17

    使用Aeson解析JSON文档时解析引用

  18. 18

    Haskell-pipes:如何使用drawAll来测试具有MonadSafe约束的生产者?

  19. 19

    为什么Haskell Pipes“使用()关闭未使用的输入,使用X(无人居住的类型)关闭未使用的输出”?

  20. 20

    使用Bing在R中进行地址解析

  21. 21

    使用domDocument在PHP中进行XML解析

  22. 22

    使用Argonaut解析JSON流

  23. 23

    如何使用 Gson 解析深层嵌套 json 对象中的字段并在 android 中进行改造?

  24. 24

    使用aeson解析JSON以获取复合数据类型

  25. 25

    使用aeson解析JSON以获取复合数据类型

  26. 26

    使用流Java 8在List Java中进行修改

  27. 27

    使用swift在JSON数据中进行循环

  28. 28

    如何在Haskell / Aeson中使用类型函数解析多态值?

  29. 29

    使用Haskell从列表中进行传递闭包

热门标签

归档