尽管已经很公平了,但我已经为这个问题苦苦挣扎了一段时间,尽管我以前对Conduit有了很多了解,因为以前我主要使用罐头示例,但有一些例外。
A
,B
和C
的基本问题是这样构成的; A .| B
(A
进入B
)和A .| C
,最后我需要有一个函数,该函数接受B和C并产生一个中间导管,将其称为{{1 }},这样我就可以Merge B C
了。我在非Haskell语言中使用FRP /流媒体库的经验表明,有几种不同的方法可以进行“合并”(例如zip系列操作“ sample on”-仅当(Merge B C) .| D
产生一个新元素时)或更多选择的输入导管具有新值,等等)。我认为我的麻烦是了解如果支持的话,如何在Conduit中执行此操作。
就今天的特定问题而言,D
与B
的比例为1:1,而A
与C
的比例为1:1,并且最终在A
中,我希望将D
的重复元素与B
的相应元素组合:如果{{1}中的C
是a~b
和a~c
1}},a
中的A
和b
中的B
,然后将c
馈入C
中。因此,我能够使用(b,c)
和它实际上是一个合理的下沉点的事实(除了性能,我没看过)。当然,正如完全预期的那样,D
对一对多关系以及如何处理它们一无所知。它具有广泛定义的zip行为,可以在输入流中循环,直到所有输入流都循环一次。
我想做到这一点的一种方法可能是通过折叠成类似列表的方式将我的一对多流变成一对一流。但是后来我不得不在管道上下文之外将其拆包。此时,我只想问一下推荐的方法是什么。
我的实际代码看起来像(ZipSink
是getZipSink
,A
是sourceDirectoryDeep
,B
是processFileName
和{{1} }是{大概是C
):
processCSV
进口(其中有些可能是多余的)是
D