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

时间:2012-11-19 07:00:46

标签: haskell conduit haskell-pipes

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..]

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

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

更新:以下是我一直在尝试的内容:http://hpaste.org/77986

看起来问题是close - 请参阅上面粘贴中的函数bar8。 如果我没有明确地>>,那么这些框架可以与close合成。当然,我最终需要关闭它们。嗯....

1 个答案:

答案 0 :(得分:1)

Frame不是monad,它是一个索引的monad。这意味着普通的monad运算符将无法工作,您必须导入它们的索引版本。根据{{​​3}},这意味着将以下内容添加到文件的顶部:

{-# LANGUAGE RebindableSyntax #-}

import Control.Frame
import Control.IMonad.Do
import Control.IMonad.Trans
import Prelude hiding (Monad(..))