【问题标题】:How to "vertically stack" Control.Frames?如何“垂直堆叠”Control.Frames?
【发布时间】:2012-11-19 07:00:45
【问题描述】:

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

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

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

source1 = fromList [1..10]
source2 = fromList [30..40]

-- combine two sources:

runFrame $ printer <-< (source1 ??? source2)

-- combine two transformers:

runFrame $ printer <-< (take' 3 ??? take' 2) <-< fromList [1..]

在此处使用&gt;&gt; 表示??? 不会进行类型检查。

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

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

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

【问题讨论】:

    标签: haskell conduit haskell-pipes


    【解决方案1】:

    Frame 不是单子,它是索引单子。这意味着普通的 monad 运算符将不起作用,您必须导入它们的索引版本。根据the tutorial,这意味着将以下内容添加到文件顶部:

    {-# LANGUAGE RebindableSyntax #-}
    
    import Control.Frame
    import Control.IMonad.Do
    import Control.IMonad.Trans
    import Prelude hiding (Monad(..))
    

    【讨论】:

    • 我正在运行教程代码,我的文件顶部有这些导入。那么索引单子的类似运算符是什么?或者我需要用来垂直堆叠 Frame 组件的函数的完全限定名称是什么?
    • 它应该与您发布的代码一起使用,因为操作员的名称完全相同。请发布您在编译时收到的错误以获得进一步的帮助。
    • 查看问题的更新 - 我已经包含了我正在使用的代码。
    • 嗯,你自己发现的。如果第一帧关闭了资源,第二帧就不能再使用了。
    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 2013-10-10
    • 2018-11-26
    • 2018-05-30
    • 1970-01-01
    • 2019-10-10
    • 2015-05-16
    相关资源
    最近更新 更多