我正在查看用于流处理的管道 3.0 包。这个教程做得很好而且很清楚,除了我不能把头绕在“压缩和合并”部分。
我的目标是像 ArrowChoice 允许的那样组合管道:
- 我有一个独特的 Either aa 制作人
- 我想将第一个管道应用于左值,另一个应用于右值
- 然后我想合并结果,并继续管道
+----------+ +------+ - 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
使用管道模拟这些东西的更好的部分)