问题标签 [haskell-pipes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
257 浏览

haskell - Haskell 管道和使用 HSpec 进行测试

我为一个使用 Pipes 的项目编写了一个程序,我喜欢它!但是,我正在努力对我的代码进行单元测试。

我有一系列类型的函数Pipe In Out IO ()(例如),我希望用 HSpec 进行测试。我该怎么办?

例如,假设我有这个域:

和这个管道:

我想写一个规范:

0 投票
1 回答
169 浏览

haskell - 了解此 Haskell 程序的内存使用情况

我应该先说我是 Haskell 和管道库的初学者,我想了解是什么导致该程序在test函数中的高内存使用。

特别是在产生r1价值的折叠中,test我看到 MyRecord 值的积累,直到产生最终结果,除非deepseq使用。在我的 ~ 500000 行 / ~ 230 MB 的样本数据集上,内存使用量超过 1.5 GB。

产生r2价值的折叠在恒定内存中运行。

我想了解的是:

1) 什么可能导致 MyMemory 值在第一折中构建,为什么使用deepseq会修复它?我非常随意地向它扔东西,直到达到使用deepseq来实现恒定的内存使用,但想了解它为什么起作用。是否可以在不使用的情况下实现恒定的内存使用deepseq,同时仍然产生相同的 Maybe Int 结果类型?

2)。第二折有什么不同导致它不表现出相同的问题?

我知道如果我只使用整数而不是元组,我可以使用sumPipes.Prelude 中的内置函数,但我最终会想要处理包含任何解析错误的第二个元素。

0 投票
1 回答
177 浏览

haskell - 如何通过 IO 操作在某些非 IO monad 中惯用且有效地使用 Pipe?

我有一个使用我自己的monadProducer创建依赖于随机性的值:Random

Randommwc-random是一个可以从STor运行的包装器IO

生产者通过policies简单的强化学习算法产生越来越好的策略。

我可以通过索引到 5,000,000 次迭代后有效地绘制策略policies

我现在想在每 500,000 步上绘制中间策略,看看它们是如何收敛的。我写了几个函数,它们获取生产者policies并提取一个列表([Policy s a]

然而,这些函数花费的时间(10 倍)和使用更多的内存(4 倍)比仅仅绘制上面的最终策略,即使学习迭代的总数应该是相同的(即 5,000,000)。我怀疑这是由于提取了一个禁止垃圾收集器的列表,这似乎是管道的一种惯用用法:

惯用的管道样式在生成元素时立即使用它们,而不是将所有元素加载到内存中。

Producer超过一些随机单子(即Random)并且我想要产生的效果时,使用这样的管道的正确方法是IO什么?

换句话说,我想将 aProducer (Policy s a) Random x插入到Consumer (Policy s a) IO x.

0 投票
0 回答
164 浏览

haskell - 没有模式匹配的管道选择

这与加布里埃尔对另一个问题的回答密切相关。我已经编写了一个函数,它提供了类似于|||fromArrowChoice但 for a Proxy(来自pipes库)的函数。它模式匹配并具有五个相互递归的功能。我想找到一个替代实现,它使用函数 fromPipes.Core而不是模式匹配。

我首先尝试left在另一个答案中调整实现。它看起来像这样:

但是,这种实现依赖于上游和下游是相同的,我看不到进一步概括它的方法。我能得到的最接近的是:

我的变体的代码片段|||很长,我只是提供它作为可以以某种方式完成的证据。该函数名为downstreamOr。所有其他函数只是相互递归的辅助函数:

看看如何在没有模式匹配的情况下实现其中任何一个会很有帮助。谢谢,如果我能澄清任何事情,请告诉我。

0 投票
1 回答
258 浏览

haskell - 将管道与返回不同值的消费者和生产者连接起来

我正在使用管道生态系统编写流功能,特别是管道并发,它基于操作库,允许我快速制作小程序片段,我通过网络向服务器或标准输入/输出发出命令一个shell命令,然后读回响应。在这种情况下,它是星号,但可以概括为任何类似的东西。

我最初写这个时考虑到管道,但它不起作用。以下代码不起作用的原因是 astPipe 返回 a Pipe _ _ IO a,而来自管道并发的 i 和 o 都返回Consumer/Producer _ IO ()。我想过让astPipeyield Maybe ByteString,然后让输出Consumer消耗Maybe ByteString,但这仍然不能解决退货的Producer问题()

我觉得我真的很接近解决方案,但我无法完全解决。您应该能够在此文件上运行堆栈以进行复制。

错误:

0 投票
3 回答
874 浏览

haskell - Haskell 中字节流的高效流式传输和操作

在为大型(<bloblength><blob>)*编码二进制文件编写反序列化器时,我遇到了各种 Haskell 生产-转换-消费库。到目前为止,我知道四个流媒体库:

这是一个精简的示例,说明当我尝试Word32使用conduit. 一个更现实的例子是首先读取Word32确定 blob 长度的 a,然后产生ByteString该长度的惰性值(然后进一步反序列化)。但在这里我只是尝试从二进制文件中以流方式提取 Word32:

程序的输出只是读取的 Word32 的数量。事实证明,流在读取第一个块(大约 32KiB)后终止。由于某种原因mbs是 never Nothing,所以我必须检查null bs当块被消耗时哪个停止流。很明显,我的导管transform有问题。我看到了解决方案的两条途径:

  1. await不想去 的第二块,ByteStream那么还有另一个函数可以拉下一个块吗?在我见过的示例中(例如 Conduit 101),这不是它的完成方式
  2. 这只是错误的设置方式transform

这是如何正确完成的?这是正确的方法吗?(性能确实很重要。)

更新:这是一种不好的方法Systems.IO.Streams

'Bad' 表示:对时间和空间要求很高,不处理 Decode 异常。

0 投票
2 回答
182 浏览

haskell - 这种请求-响应类型是否有标准抽象?

我有以下类型:

这个想法是将其用作网络通信的纯表示,即:

然后将由一些不纯函数评估eval

现在,这是什么(如果有的话?)据我所知,它不是单子,也不是箭头。它似乎是流/管道/自动机/fsm和延续单子之间的东西。这让我觉得这种类型的东西可能有更好的表示,但是什么?

0 投票
2 回答
72 浏览

haskell - 理解haskell中的错误

我(Haskell 新手)正在尝试对从网页收到的 ByteString 执行解包操作。基本上我想从网页中搜索几个单词,所以我试图标记流,然后从单词中搜索单词。

但我得到以下错误

从hackage我可以看到它的签名是

0 投票
1 回答
491 浏览

haskell - 如何将基于拉的管道变成基于推的管道?

默认情况下,管道是基于拉的。这是由于实现的操作>->符是他的拉动类别+>>的重要操作符。bind我的理解是,这意味着如果你有类似producer >-> consumer的代码,首先会调用消费者的主体,然后一旦等待数据,就会调用生产者。

我在这里pipes的文档中看到,您可以使用代码将基于拉的管道转换为基于推的管道。这意味着相反(如果我错了,请纠正我)在上面的代码中,生产者首先运行,产生一个值,然后消费者尝试消费。这似乎真的很有用,我想知道该怎么做。(reflect .)Pipes.Coreproducer >-> consumer

我在这里的讨论中也看到,没有基于推送的对应物,>->因为它很容易扭转任何管道(我假设使用反射?),但我真的不知道如何去做或找到任何例子。

这是我尝试过的一些代码:

0 投票
1 回答
444 浏览

csv - 使用管道 csv 从 csv 文件中读取第一行

我正在阅读带有管道 csv 库的 csv 文件。我想阅读第一行,然后再阅读其余部分。不幸的是 Pipes.Prelude.head 函数返回后。管道正在以某种方式关闭。有没有办法先读取 csv 的头部,然后再读取其余部分。

如果我们不先读取标题,我们可以毫无问题地读取整个 csv: