【发布时间】:2019-02-12 06:38:53
【问题描述】:
是否可以在 Conduit 中构建一个函数(比如 zipC2)来转换以下来源:
series1 = yieldMany [2, 4, 6, 8, 16 :: Int]
series2 = yieldMany [1, 5, 6 :: Int]
到一个会产生以下对(这里显示为列表):
[(Nothing, Just 1), (Just 2, Just 1), (Just 4, Just 1), (Just 4, Just 5), (Just 6, Just 6), (Just 8, Just 6), (Just 16, Just 6)]
它将通过以下方式使用比较函数调用:
runConduitPure ( zipC2 (<=) series1 series1 .| sinkList )
以前的版本中曾经有一个 mergeSources 函数,它做的事情相对相似(虽然没有记忆效应),但在最新版本 (1.3.1) 中消失了。
关于函数如何工作的说明: 这个想法是采用 2 个源 A(生成值 a)和 B(生成值 b)。
然后我们生成对:
如果 a 我们首先构建 (Just a, Nothing)
如果 b 它将产生 (Nothing, Just b)
如果 a == b 我们更新双方并产生 (Just a, Just b)
源中未更新的值不被消耗,用于下一轮比较。仅使用更新的值。
然后,我们根据 A 和 B 中相对于彼此的值不断更新该对。
换句话说:如果 a 我们更新对的左侧,如果 b 则更新右侧,或者如果 a 则更新两侧== b。任何未使用的值都会保存在内存中,以供下一轮比较。
【问题讨论】: