小编Ben*_*son的帖子

将导管与多个输入融合

我正在尝试创建一个可以使用多个输入流的管道.我需要能够在没有特定顺序(例如,不交替)的情况下等待输入流中的一个或另一个,使得zip无用.这里没有任何平行或不确定的东西:我等待一个流或另一个流.我希望能够编写类似于以下的代码(分别在第一个或第二个输入流上的where awaitAawaitBawait):

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 …

haskell conduit

9
推荐指数
1
解决办法
1010
查看次数

标签 统计

conduit ×1

haskell ×1