gpt4 book ai didi

scala - 是否有类似 Iteratee 的概念从多个来源提取数据?

转载 作者:行者123 更新时间:2023-12-04 01:35:19 25 4
gpt4 key购买 nike

可以使用流(惰性列表)从多个(为简单起见说两个)源中按需提取。 Iteratees 可用于处理来自单一来源的数据。

是否有类似 Iteratee 的功能概念来处理多个输入源?我可以想象一个 Iteratee 的状态信号,它想从哪个源中提取。

最佳答案

要使用管道来做到这一点,您将 Pipe monad 转换器嵌套在其自身中,对于您希望与之交互的每个生产者一次。例如:

import Control.Monad
import Control.Monad.Trans
import Control.Pipe

producerA, producerB :: (Monad m) => Producer Int m ()
producerA = mapM_ yield [1,2,3]
producerB = mapM_ yield [4,5,6]

consumes2 :: (Show a, Show b) =>
Consumer a (Consumer b IO) r
consumes2 = forever $ do
a <- await -- await from outer producer
b <- lift await -- await from inner producer
lift $ lift $ print (a, b)

就像多个变量的 Haskell 柯里化(Currying)函数一样,您可以使用组合和 runPipe 将其部分应用于每个源:
consumes1 :: (Show b) => Consumer b IO ()
consumes1 = runPipe $ consumes2 <+< producerA

fullyApplied :: IO ()
fullyApplied = runPipe $ consumes1 <+< producerB

上述函数运行时输出:
>>> fullyApplied
(1, 4)
(2, 5)
(3, 6)

这个技巧适用于让或等待上游或下游任意数量的管道。它也适用于代理,即管道的双向类似物。

编辑:请注意,这也适用于任何迭代库,而不仅仅是 pipes .事实上,John Milikin 和 Oleg 是这种方法的最初倡导者,我只是从他们那里窃取了这个想法。

关于scala - 是否有类似 Iteratee 的概念从多个来源提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com