问题标签 [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.
parsing - 将普通 attoparsec 解析器代码转换为基于管道/管道
我使用以下方法编写了以下解析代码attoparsec
:
这适用于小型文件,我执行它是这样的:
但是当文件的大小大于 70MB 时,它会消耗大量的内存。作为解决方案,我想我会使用attoparsec-conduit
. 在浏览了他们的API之后,我不确定如何让它们一起工作。我的解析器具有类型Parser Test
,但它sinkParser
实际上接受 type 的解析器Parser a b
。我对如何在常量内存中执行这个解析器感兴趣?(基于管道的解决方案也是可以接受的,但我不习惯 Pipes API。)
haskell - 在实现 MonadIO 的 Monad 中嵌入异步
我有一些pipes-concurrency
看起来像这样的代码:
问题 1:这显然不会编译,因为runEffect
will returnMonadIO m => m ()
和async
requires IO a
。有没有办法做到这一点?还是我被困在强迫我的管道包含 IO monad 中的效果?
问题 2:在实现 MonadIO 的 Monad 中嵌入异步是否有意义?不确定我是否在这里很好地表达了自己。
谢谢!
haskell - 简单函数的管道等效代码
比方说,我有以下类型:
现在,我想编写一个基于管道的函数来执行此操作:
假设我已经有 和 的 Producers Link
,Snap
如何getSnaps
从这两个 Producer 中实现 Pipes 世界中的上述功能:
psnap
和的实际类型plink
更多(使用 attoparsec-pipes 创建),但我想知道如何实现 getSnaps frompsnap
和的功能plink
。有没有解决此类问题的正确方法?
haskell - 跳过管道中的第一行 - attoparsec
我的类型:
我的解析器:
现在为了跳过第一行,我做了这样的事情:
但是上面的parser
函数使每个备用链接都跳过(这很明显)。如何仅以与 Pipes 生态系统一起使用的方式跳过第一行(Producer
应该产生单个Test
值。)这是我不想要的一个明显的解决方案(以下代码仅在我修改 testParser 以读取换行符时才有效) 因为它返回整个[Test]
而不是单个值:
有什么想法可以解决这个问题吗?
haskell - 在管道内运行消费者
我需要组合一个消费者和一个管道,以便消费者的输出可以输入管道的输入。
我想这可以用这样的组合器来解决:
或这个:
或类似以下的提升功能:
或像这样:
我试过consumer >~ pipe
没有成功。那么如何处理呢?
loops - 如果 MonadPlus 是“生成器”类,那么什么是“消费者”类?
APipe
可以分为两部分:生成器部分 ( yield
) 和消费者部分 ( await
)。
如果你有一个Pipe
只使用它的生成器一半,并且只返回()
(或从不返回),那么它可以表示为“ListT
正确完成”。事实证明,它MonadPlus
可以用来表示像 ListT-done-right 这样的任何东西。引用 Gabriel Gonzalez 的话:
请注意,您可以
ListT
仅使用转换器依赖项构建任何(不仅仅是管道中的)。例如,以下是您将如何实现的ListT
模拟Pipes.Prelude.stdinLn
:这将像任何类型一样输入 check
ListT
并为所有这些做正确的事情。
ListT
所以我的问题是这样的:管道的MonadPlus
消费者部分是否有双重关系?
要求:
- 一个从不使用
yield
,只返回()
(或从不返回)但确实使用的管道await
可以表示为这个“对 ListT”。 - “dual to ListT”可以推广到“dual of MonadPlus”
haskell - 带有 RWST 的管道中的空间泄漏
以下程序的内存分析表明,noleak 函数在常量内存中运行,而泄漏函数以线性方式泄漏内存。dflemstr 指出这可能是由于 RWST 导致了无限的分配链。是这种情况吗?还有其他解决方案吗?我实际上不需要 Writer monad。
环境:
ARCH 64 位上的 GHC 7.8.3
ghc Pipe.hs -o 管道 -prof
haskell - 在 Haste 和 Haskell 中使用管道睡觉
我正在开发一个大量使用 Pipes 库的 Haskell 程序。我正在将库的一部分移植到Haste。我遇到绊脚石的一个地方是javascript处理睡眠的奇怪方式。
我想写的是一个简单的管道,它在发送结果之前会延迟
但是,睡眠似乎像回调一样工作。
我试着做
但是类型没有正确排列。有没有办法获得延迟管道?
haskell - 管道和非管道代码之间的并发注意事项
我正在为管道接口中的某些编码包装一个 C 库,但我遇到了一些需要做出的设计决策。
建立 C 库后,我们保留一个编码器上下文。有了这个,我们可以编码,或者改变一些参数(让我们调用 Haskell 接口到最后一个函数tune :: Context -> Int -> IO ()
)。我的问题有两个部分:
- 编码部分很容易包含在 . 中
Pipe Foo Bar IO ()
,但我也想公开tune
. 由于同时使用编码上下文必须受到锁保护,因此我需要在管道中的每次迭代时都使用锁,并tune
使用相同的锁进行保护。但现在我觉得我在强迫用户隐藏锁。我在这里吠错树了吗?这种情况在管道生态系统中通常是如何解决的?就我而言,我希望我的特定代码所属的管道始终在其自己的线程中运行,同时进行调整,但我不想将这种观点强加给任何用户。管道生态系统中的其他软件包似乎也没有强迫他们的用户喜欢。 - 不再使用的编码上下文需要正确地取消初始化。在管道生态系统中,如何确保
IO
在管道被销毁时处理这些事情(在这种情况下执行 som 操作)?
一个具体的例子是包装一个压缩库,在这种情况下,上面可以是:
- 压缩强度是可调的。我们设置了管道,它愉快地运行。假设必须序列化对压缩编解码器上下文的并发访问,最好如何在管道继续运行时更改压缩强度设置?
- 压缩库在设置时从 Haskell 堆中分配了一堆内存,当管道被拆除时,我们需要调用一些库函数来清理这些内存。
谢谢......这可能都很明显,但我对管道生态系统很陌生。
编辑:发布后阅读此内容,我很确定这是我在这里问过的最模糊的问题。啊! 对不起 ;-)