我正在尝试创建一个可以使用多个输入流的管道.我需要能够在没有特定顺序(例如,不交替)的情况下等待输入流中的一个或另一个,使得zip无用.这里没有任何平行或不确定的东西:我等待一个流或另一个流.我希望能够编写类似于以下的代码(分别在第一个或第二个输入流上的where awaitA和awaitBawait):
do
_ <- awaitA
x <- awaitA
y <- awaitB
yield (x,y)
_ <- awaitB
_ <- awaitB
y' <- awaitB
yield (x,y')
Run Code Online (Sandbox Code Playgroud)
我所拥有的最好的解决方案是使内部monad成为另一个导管,例如
foo :: Sink i1 (ConduitM i2 o m) ()
Run Code Online (Sandbox Code Playgroud)
然后允许
awaitA = await
awaitB = lift await
Run Code Online (Sandbox Code Playgroud)
这主要是有效的.不幸的是,这似乎使得在外导管完全连接之前很难熔化到内导管.我尝试的第一件事是:
fuseInner :: Monad m =>
Conduit i2' m i2 ->
Sink i1 (ConduitM i2 o m) () ->
Sink i1 (ConduitM i2' o m) ()
fuseInner x = transPipe (x =$=)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,至少在x …