问题标签 [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 回答
98 浏览

haskell - 如何“垂直堆叠”Control.Frames?

pipes包中,教程Control.Pipes.Tutorial[1] 展示了如何使用 monad>>运算符“垂直堆叠”管道组件。

我将如何使用 Control.Frame 来做到这一点?

例如,使用 Control.Frame 教程中的定义:

在此处使用>>for???不会进行类型检查。

[1] http://hackage.haskell.org/packages/archive/pipes/latest/doc/html/Control-Pipe-Tutorial.html#g:4

更新:这是我一直在尝试的粘贴:http: //hpaste.org/77986

看起来close是问题所在 - 请参阅bar8上面粘贴中的函数。>>如果我没有明确说明,这些框架是可组合的close。当然,我最终需要关闭它们。嗯……

0 投票
2 回答
909 浏览

haskell - Iteratees和FRP之间有什么联系?

在我看来,这两个想法之间有很强的联系。我的猜测是,如果有一种方法可以用 Iteratees 表达任意图,那么 FRP 可以用 Iteratees 来实现。但是 afaik 他们只支持链状结构。

有人可以对此有所了解吗?

0 投票
1 回答
928 浏览

haskell - 管道 3.0:非线性拓扑

我正在查看用于流处理的管道 3.0 包。这个教程做得很好而且很清楚,除了我不能把头绕在“压缩和合并”部分。

我的目标是像 ArrowChoice 允许的那样组合管道:

  • 我有一个独特的 Either aa 制作人
  • 我想将第一个管道应用于左值,另一个应用于右值
  • 然后我想合并结果,并继续管道

fork在教程中定义如下:

问题是我无法使类型正确。本教程似乎只展示了如何将内部(提升)管道链作为自包含会话运行,但我希望能够将其值重新注入管道,而不仅仅是对它们应用效果。我当然尝试过遵循这些类型,但它们很快就会变得有点毛茸茸。

有人可以帮助我吗?提前致谢。

(PS:这种拓扑结构的示例将是对教程的一个很好的补充,或者甚至是关于如何Control.Arrow使用管道模拟这些东西的更好的部分)

0 投票
2 回答
594 浏览

haskell - 使用管道的 WriterP 编写一个简单的累加器

使用管道库,我想编写一个程序来从某个源读取数据并将其累积(例如,使用Sum)。最简单的方法是,

当然,虽然这适用于小源,但由于WriterT累加器的惰性,大输入会导致可怕的堆栈溢出。

值得庆幸的是,它似乎pipes预料到了这一点,为WriterP代理提供了严格的累加器。不幸的是,围绕这个代理的文档非常稀少。经过一番摸索(并简化了问题,而是为每个下游元素累积一个 1),我来到了这个程序,

当然,这个程序甚至没有正确执行简化的任务,因为它累积到 1 而不是 6。如果我没记错的话,这种行为可以通过管道在终止之前只读取一个元素这一事实来解释。重复直到输入结束,我想出了以下内容,

但是,此代码返回的累加器为 0。这是为什么呢?有没有像我fold提供的功能pipes

鉴于 for 的许多用例pipes是处理大型数据集的长时间运行的流程,Control.Proxy.Prelude围绕严格WriterP而不是WriterT. 目前感觉中的代理转换pipes器是二等公民,存在但缺少许多WriterT如此方便的组合器。

0 投票
3 回答
504 浏览

haskell - 在基本单子中将代理与不同的 EitherT 组合起来

例如,拥有...

...我如何使这项工作?

注意:我读过Mixing Base Monads in Control.Proxy.Tutorial。我得到了第一个示例,但无法理解人为的示例。更多的例子,不是那么明显但不是那么做作,可能会阐明如何使用hoistlift匹配基本单子的任何组合。

0 投票
2 回答
359 浏览

haskell - 管道的上游类型参数的真正好处是什么?

我试图了解管道概念的不同实现之间的差异。导管管道之间的区别之一是它们如何将管道融合在一起。导管

管道

如果我理解正确,则使用管道,当两个管道中的任何管道停止时,将返回其结果并停止另一个。使用管道,如果左管道完成,其结果将向下游发送到右管道。

我想知道,管道方法的好处是什么?我希望看到一些示例(最好是真实世界),使用管道和 很容易实现>+>使用管道>->.

0 投票
2 回答
1190 浏览

haskell - 管道的剩菜有什么好处?

我试图了解导管管道之间的区别。与管道不同,管道有剩菜的概念。剩菜有什么用?我想看看一些剩菜必不可少的例子。

而且由于管道没有剩菜的概念,有没有办法用它们实现类似的行为?

0 投票
2 回答
818 浏览

parsing - 管道 attoparsec 中的“子解析器”

我正在尝试使用 Haskell 中的管道 attoparsec 解析二进制数据。涉及管道(代理)的原因是将读取与解析交错以避免大文件的高内存使用。许多二进制格式基于块(或块),它们的大小通常由文件中的字段描述。我不确定这样一个块的解析器被称为什么,但这就是我在标题中所说的“子解析器”的意思。我遇到的问题是以简洁的方式实现它们,而不会占用大量内存。我想出了两个在某些方面都失败的替代方案。

备选方案 1 是将块读入单独的字节串并为其启动单独的解析器。虽然简洁,但大块将导致高内存使用。

备选方案 2 是在相同的上下文中继续解析并跟踪消耗的字节数。这种跟踪很容易出错,并且似乎感染了构成最终 blockParser 的所有解析器。对于格式错误的输入文件,在可以比较跟踪的大小之前,它还可能通过比大小字段指示的更远的解析来浪费时间。

0 投票
2 回答
1146 浏览

haskell - Haskell 管道和分支

问题

我正在尝试使用 Haskell 和 Pipes 库实现一个简单的 Web 服务器。我现在明白循环或菱形拓扑对于管道是不可能的,但是我认为我想要的是。因此,我想要的拓扑是:

我有链中使用的类型HTTPRequest RequestLine Headers Message。从套接字获取字节并将它们转发给,后者使用 Attoparsec 将字节解析为对象。然后,我希望管道至少分支两次,并且可能更多,这取决于我实现了多少 HTTP 方法。每个函数都应该从上游接收对象并将对象转发到,这只是将 HTTPResponse 对象打包到准备好与 一起发送。HTTPResponse StatusLine Headers MessagesocketReadSparseRequestHTTPRequesthandle<method>HTTPRequestHTTPResponsepackRequestByteStringsocketWriteS

如果我让 GHC 推断类型,则以下代码类型检查routeRequest'''(我的似乎有点偏离)。但是,之后似乎没有任何执行parseRequest。谁能帮我弄清楚为什么?

代码

我有以下代码routeRequest应该处理分支。

handleGEThandlePOST这样实现:

我有以下代理的简写:

最后,我像这样运行整个事情:

的类型签名parseRequestProxy是这样的:

编辑

这是带有源代码的存储库。请注意,它没有经过修饰,因此使用风险自负。https://bitbucket.org/Dwilson1234/haskell-web-server/overview

0 投票
2 回答
495 浏览

haskell - 如何编写一个向下游发送它从上游接收的列表的管道?

我很难pipe用这个签名写一个:

它应该简单地a从上游获取所有 s 并将它们发送到下游列表中。

我所有的尝试看起来都从根本上失败了。

谁能指出我正确的方向?