【发布时间】:2013-01-07 08:04:45
【问题描述】:
我正在查看用于流处理的管道 3.0 包。 The tutorial 做得很好也很清楚,只是我无法绕开“压缩和合并”部分。
我的目标是像 ArrowChoice 允许的那样组合管道:
- 我有一个独特的 Either a a 制作人
- 我想将第一个管道应用于左值,另一个应用于右值
- 然后我想合并结果,并继续管道
+----------+ +------+ - filterLeft -> pipe1 -> +------------+
| producer | - (Either a a) -> | fork | | mergeD (?) |
+----------+ +------+ - filterRight -> pipe2 -> +------------+
我在教程中定义fork:
fork () =
runIdentityP . hoist (runIdentityP . hoist runIdentityP) $ forever $ do
a <- request ()
lift $ respond a
lift $ lift $ respond a
oddOrEven x = if odd x then Left x else Right x
producer = fromListS [1..0] >-> mapD oddOrEven
isLeft (Left _) = True
isLeft (Right _) = False
isRight = not . isLeft
filterLeft = filterD isLeft
filterRight = filterD isRight
pipe1 = mapD (\x -> ("seen on left", x))
pipe2 = mapD (\x -> ("seen on right", x))
p1 = producer >-> fork
问题是我无法使类型正确。本教程似乎只展示了如何将内部(提升)管道链作为自包含会话运行,但我希望能够将其值重新注入管道,而不仅仅是对它们应用效果。我当然尝试过追随这些类型,但它们很快就会变得有点毛茸茸。
有人可以帮助我吗?提前致谢。
(PS:这种拓扑的示例将是本教程的一个很好的补充,或者更好的部分是关于如何使用管道模拟Control.Arrow 的东西)
【问题讨论】:
-
嗯,现在没有足够的时间来完整回答,但这里有一些值得深思的地方:hpaste.org/80426
-
您是沿着两个分支双向寻找,还是严格来说这是从左到右的单向流动?
-
@Dan Burton,谢谢你的馅饼。我对 Kleisli 的东西不太放心,这实际上就是我看管道的原因!有了它,一切看起来都简单多了!
-
@Davorak,我根本不需要双向性,流是直接无环图(本质上,我只是在尝试构建有状态过滤器)
标签: haskell haskell-pipes