问题标签 [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.
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
。当然,我最终需要关闭它们。嗯……
haskell - Iteratees和FRP之间有什么联系?
在我看来,这两个想法之间有很强的联系。我的猜测是,如果有一种方法可以用 Iteratees 表达任意图,那么 FRP 可以用 Iteratees 来实现。但是 afaik 他们只支持链状结构。
有人可以对此有所了解吗?
haskell - 管道 3.0:非线性拓扑
我正在查看用于流处理的管道 3.0 包。这个教程做得很好而且很清楚,除了我不能把头绕在“压缩和合并”部分。
我的目标是像 ArrowChoice 允许的那样组合管道:
- 我有一个独特的 Either aa 制作人
- 我想将第一个管道应用于左值,另一个应用于右值
- 然后我想合并结果,并继续管道
我fork
在教程中定义如下:
问题是我无法使类型正确。本教程似乎只展示了如何将内部(提升)管道链作为自包含会话运行,但我希望能够将其值重新注入管道,而不仅仅是对它们应用效果。我当然尝试过遵循这些类型,但它们很快就会变得有点毛茸茸。
有人可以帮助我吗?提前致谢。
(PS:这种拓扑结构的示例将是对教程的一个很好的补充,或者甚至是关于如何Control.Arrow
使用管道模拟这些东西的更好的部分)
haskell - 使用管道的 WriterP 编写一个简单的累加器
使用管道库,我想编写一个程序来从某个源读取数据并将其累积(例如,使用Sum
)。最简单的方法是,
当然,虽然这适用于小源,但由于WriterT
累加器的惰性,大输入会导致可怕的堆栈溢出。
值得庆幸的是,它似乎pipes
预料到了这一点,为WriterP
代理提供了严格的累加器。不幸的是,围绕这个代理的文档非常稀少。经过一番摸索(并简化了问题,而是为每个下游元素累积一个 1),我来到了这个程序,
当然,这个程序甚至没有正确执行简化的任务,因为它累积到 1 而不是 6。如果我没记错的话,这种行为可以通过管道在终止之前只读取一个元素这一事实来解释。重复直到输入结束,我想出了以下内容,
但是,此代码返回的累加器为 0。这是为什么呢?有没有像我fold
提供的功能pipes
?
鉴于 for 的许多用例pipes
是处理大型数据集的长时间运行的流程,Control.Proxy.Prelude
围绕严格WriterP
而不是WriterT
. 目前感觉中的代理转换pipes
器是二等公民,存在但缺少许多WriterT
如此方便的组合器。
haskell - 在基本单子中将代理与不同的 EitherT 组合起来
例如,拥有...
...我如何使这项工作?
注意:我读过Mixing Base Monads in Control.Proxy.Tutorial
。我得到了第一个示例,但无法理解人为的示例。更多的例子,不是那么明显但不是那么做作,可能会阐明如何使用hoist
和lift
匹配基本单子的任何组合。
haskell - 管道的上游类型参数的真正好处是什么?
我试图了解管道概念的不同实现之间的差异。导管和管道之间的区别之一是它们如何将管道融合在一起。导管有
而管道有
如果我理解正确,则使用管道,当两个管道中的任何管道停止时,将返回其结果并停止另一个。使用管道,如果左管道完成,其结果将向下游发送到右管道。
我想知道,管道方法的好处是什么?我希望看到一些示例(最好是真实世界),使用管道和 很容易实现,但>+>
使用管道和>->
.
haskell - 管道的剩菜有什么好处?
我试图了解导管和管道之间的区别。与管道不同,管道有剩菜的概念。剩菜有什么用?我想看看一些剩菜必不可少的例子。
而且由于管道没有剩菜的概念,有没有办法用它们实现类似的行为?
parsing - 管道 attoparsec 中的“子解析器”
我正在尝试使用 Haskell 中的管道 attoparsec 解析二进制数据。涉及管道(代理)的原因是将读取与解析交错以避免大文件的高内存使用。许多二进制格式基于块(或块),它们的大小通常由文件中的字段描述。我不确定这样一个块的解析器被称为什么,但这就是我在标题中所说的“子解析器”的意思。我遇到的问题是以简洁的方式实现它们,而不会占用大量内存。我想出了两个在某些方面都失败的替代方案。
备选方案 1 是将块读入单独的字节串并为其启动单独的解析器。虽然简洁,但大块将导致高内存使用。
备选方案 2 是在相同的上下文中继续解析并跟踪消耗的字节数。这种跟踪很容易出错,并且似乎感染了构成最终 blockParser 的所有解析器。对于格式错误的输入文件,在可以比较跟踪的大小之前,它还可能通过比大小字段指示的更远的解析来浪费时间。
haskell - Haskell 管道和分支
问题
我正在尝试使用 Haskell 和 Pipes 库实现一个简单的 Web 服务器。我现在明白循环或菱形拓扑对于管道是不可能的,但是我认为我想要的是。因此,我想要的拓扑是:
我有链中使用的类型HTTPRequest RequestLine Headers Message
。从套接字获取字节并将它们转发给,后者使用 Attoparsec 将字节解析为对象。然后,我希望管道至少分支两次,并且可能更多,这取决于我实现了多少 HTTP 方法。每个函数都应该从上游接收对象并将对象转发到,这只是将 HTTPResponse 对象打包到准备好与 一起发送。HTTPResponse StatusLine Headers Message
socketReadS
parseRequest
HTTPRequest
handle<method>
HTTPRequest
HTTPResponse
packRequest
ByteString
socketWriteS
如果我让 GHC 推断类型,则以下代码类型检查routeRequest'''
(我的似乎有点偏离)。但是,之后似乎没有任何执行parseRequest
。谁能帮我弄清楚为什么?
代码
我有以下代码routeRequest
应该处理分支。
handleGET
并handlePOST
这样实现:
我有以下代理的简写:
最后,我像这样运行整个事情:
的类型签名parseRequestProxy
是这样的:
编辑
这是带有源代码的存储库。请注意,它没有经过修饰,因此使用风险自负。https://bitbucket.org/Dwilson1234/haskell-web-server/overview
haskell - 如何编写一个向下游发送它从上游接收的列表的管道?
我很难pipe
用这个签名写一个:
它应该简单地a
从上游获取所有 s 并将它们发送到下游列表中。
我所有的尝试看起来都从根本上失败了。
谁能指出我正确的方向?