问题标签 [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 投票
1 回答
116 浏览

haskell - 从“托管”管道流式传输

我用来将'sControl.Monad.Managed包装在一个延续转换器中,但我还想在之后将 HTTP 响应流式传输出去:pipes-httpwithHTTP

fromHTTP是为了流出响应体。如果以上运行:

recv: invalid argument (Bad file descriptor)在第一块之后得到,因为http-client'responseClose已经关闭了我的响应正文。

with如果我想公开一个非样式接口,我应该如何使用管道流式传输 HTTP 响应?

如果我严重误解了延续和管道,谢谢并道歉。

0 投票
2 回答
500 浏览

haskell-pipes - 使用haskell管道字节串逐行迭代文件

我正在使用管道库,需要String使用 ASCII 编码将 ByteString 流转换为行流(即)。我知道还有其他库(Pipes.Text 和 Pipes.Prelude)可能让我更轻松地从文本文件中生成行,但是由于其他一些代码,我需要能够StringByteString.

更正式地说,我需要将 a 转换Producer ByteString IO ()为 a Producer String IO (),这会产生线条。

我敢肯定,对于经验丰富的 Pipes-Programmer 来说,这一定是单线,但到目前为止,我还没有成功破解 Pipes-ByteString 中的所有FreeTLens-trickery。

任何帮助深表感谢!

斯蒂芬

0 投票
1 回答
597 浏览

haskell - 替换列表列表中的元素——haskell

我有这个代码:

replaceNth :: 函数将位置值 ' - ' 替换为 (' P ')

我想将矩阵中的每个案例都更改为 ' - ' 为 ' P '

但它不工作,我总是这个错误:

0 投票
0 回答
97 浏览

ghc - 可以增强 GHC 以在错误消息中打印类型别名吗?

我想知道这是否是一个合理的功能请求(如果它已经存在并且我不知道如何访问它,那就更好了)。

为什么这是可取的一个例子是管道库。Pipes 定义了一个类型:

有大量的别名,其中一些是:

可以想象,这是明确错误消息的最坏情况。作为阅读文档的程序员,您正在考虑具有少量参数的更简单类型,但所有错误消息都是具有六个参数的怪物类型,如下所示:

如果该消息可能如下所示会更清楚:

作为一个附带问题,为什么 GHC 会忘记它用 b0 替换的特定类型 Integer 而它以某种方式记住 Bool ?声明的类型是:

反正 ...

类型别名的更好的错误报告是否可以作为功能请求,或者 GHC 是否在检测到类型错误之前很久就忘记了别名?(在我看来,GHC 必须跟踪别名,因为 GHC 似乎在错误消息的“实际类型”部分记住了它,但我不知道编译器是如何工作的。)

0 投票
1 回答
190 浏览

haskell - 管道获取 Network.Socket.ByteString.recv:失败(未知错误)

也许做事的方式很愚蠢,但就是这样。我想将 HTTP 请求发送/接收与处理响应分开。

似乎合法。但是我得到了部分响应打印和“Network.Socket.ByteString.recv:失败(未知错误)”。我需要做些什么不同的事情?

0 投票
2 回答
178 浏览

haskell - 由内而外构建管道代理

是否可以创建一个函数,以便可以从内到外构造一个Proxyfrom管道?由内而外,我的意思是从连接上游和下游连接的函数创建代理。最理想(但不可能)的签名是

我们遇到的第一个问题是构建Proxy. 我们无法知道函数是否查看Server或,Client除非让它们中的每一个都成为M,在这种情况下,我们只会知道它查看的是哪一个,而不是它试图向上游或下游发送什么值。如果我们专注于上游端,我们唯一知道的就是试图弄清楚上游代理是什么,所以我们需要决定要么总是导致Request上游更远,要么Responding。无论我们如何回答,我们唯一能提供的价值是(). 这意味着我们可以Request ()向上游生产者或Respond ()立即地。如果我们考虑对两端都进行此选择,则只有四种可能的功能。以下函数以它们的上游和下游连接是向下游 ( D) 还是上游 ( U) 发送感兴趣的数据命名。

betweenDD最有趣的是,它会在 aProducer和 a之间建立一个管道ConsumerbetweenUU将对上游运行的管道执行相同的操作。betweenDU将消耗从两个来源之一请求它的数据。betweenUD将产生数据,将其发送到两个目的地之一。

我们可以提供一个定义betweenDD吗?如果没有,我们能否改为为以下更简单的函数提供定义?

这个问题的动机是试图写belowD来回答关于P.zipWith.

例子

这个例子恰好是激发这个问题的问题。.

假设我们要创建一个Pipenumber通过它的值。将Pipe具有a从上方传到下游的值和从(n, a)下方离开下游的值;换句话说,它将是一个Pipe a (n, a).

我们将通过zipping 数字来解决这个问题。zip用数字 ing的结果是一个(->)从 aProducer a到 a的函数Producer (n, a)

即使Pipe会从上游消耗as,但从函数的角度来看,它需要 a Producerof as 来提供这些值。如果我们有一个定义,belowD我们可以写

给定一个合适的定义fromList

0 投票
1 回答
621 浏览

haskell - How to detect end of input with pipes

I'm trying to read a group of up to 50 items from a pipe and process them in an IO action all at once. (The use case for this is I'm trying to insert data into a database and I want to do an entire batch inside one transaction because it is vastly more efficient). Here is a simplified version of what I've got so far:

The problem is as far as I can tell, unless the number of items to insert happens to divide by 50, I'm going to miss some. What I really want instead of replicateM 50 await is something that gives me up to 50 items or fewer if the input ends but I can't quite figure out how to write that.

I've been thinking that pipes-parse might be the right library to be looking at. draw looks to have a promising signature... but so far all the bits aren't fitting together in my head. I have a producer, I'm writing a consumer and I don't really get how that relates to the concept of a parser.

0 投票
2 回答
3103 浏览

haskell - Haskell 快速并发队列

问题

你好!我正在编写一个日志库,我很想创建一个记录器,它将在单独的线程中运行,而所有应用程序线程只会向它发送消息。我想为这个问题找到最有效的解决方案。我在这里需要简单的未绑定队列。

方法

我创建了一些测试来查看可用解决方案的性能,我在这里得到了非常奇怪的结果。我基于以下内容测试了 4 个实现(下面提供了源代码):

  1. 管道并发
  2. Control.Concurrent.Chan
  3. Control.Concurrent.Chan.Unagi
  4. 如“Haskell 中的并行和并发编程”一书中所述,基于 MVar请注意,这种技术为我们提供了容量为 1 的有界队列 - 它仅用于测试

测试

以下是用于测试的源代码:

您可以编译它ghc -O2 Main.hs并运行它。测试创建了 20 个消息生产者,每个生产者产生 1000000 条消息。

结果

问题

我很想问你为什么管道并发版本的执行速度如此之慢,以及为什么它甚至比基于 chan 的版本还要慢得多。我很惊讶,MVar 是所有版本中最快的——谁能告诉更多,为什么我们会得到这个结果,以及在任何情况下我们是否可以做得更好?

0 投票
1 回答
309 浏览

haskell - 使用管道 aeson 解析 JSON 流

给定一个简单的 JSON 类型示例:

如何使用管道 aeson 解码使用decoded镜头通过套接字传来的 JSON 消息流?作为一个例子,我想在解析它们时将它们打印出来:

0 投票
2 回答
250 浏览

haskell - Haskell Pipes - 获取管道中最后一个代理的返回值

假设我Proxy在 Haskell Pipes 中有两个。它们代表外部系统进程。

所以我把它们钩成一个Effect,像这样:

Effect将给我ExitCode从第一个Proxy终止的开始。通常这将是produce,而不是consumeconsume即使它没有首先终止,获取返回值的惯用管道方法是什么?

到目前为止,我认为如果不执行某种 icky 带内信令,这是不可能的,因此consume知道流已完成。最后一个 Proxy 知道要关闭的唯一方法是从 中获取一些东西await,所以我可以向它发送一个空ByteString来表示流已完成。只是感觉不对。我现在拥有的是一个单独的 MVar,它可以提供退出值,但我认为必须有一种更惯用的方式来做到这一点。