gpt4 book ai didi

haskell - 管道 - 将多个来源/生产者合并为一个

转载 作者:行者123 更新时间:2023-12-02 10:05:52 26 4
gpt4 key购买 nike

我正在使用 sourceFile 读取文件,但我还需要在处理操作中引入随机性。我认为最好的方法是拥有一个这样的制作人

Producer m (StdGen, ByteString)

其中 StdGen 用于生成随机数。

我打算让生产者执行 sourceFile 的任务,并在每次向下游发送数据时生成一个新的种子来产生。

我的问题是,似乎没有像 zipSink 这样的源组合器用于接收器。通读Conduit Overview ,这似乎建议您可以将 Source 嵌入 Conduit 中,但我无法在示例中看到它是如何完成的。

任何人都可以提供一个将两个或多个 IO 源融合到一个 Producer/Source 中的示例吗?

编辑:

一个例子:

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE OverloadedStrings #-}

import System.Random (StdGen(..), split, newStdGen, randomR)
import ClassyPrelude.Conduit as Prelude
import Control.Monad.Trans.Resource (runResourceT, ResourceT(..))
import qualified Data.ByteString as BS

-- generate a infinite source of random number seeds
sourceStdGen :: MonadIO m => Source m StdGen
sourceStdGen = do
g <- liftIO newStdGen
loop g
where loop gin = do
let g' = fst (split gin)
yield gin
loop g'

-- combine the sources into one
sourceInput :: (MonadResource m, MonadIO m) => FilePath -> Source m (StdGen, ByteString)
sourceInput fp = getZipSource $ (,)
<$> ZipSource sourceStdGen
<*> ZipSource (sourceFile fp)

-- a simple conduit, which generates a random number from provide StdGen
-- and append the byte value to the provided ByteString
simpleConduit :: Conduit (StdGen, ByteString) (ResourceT IO) ByteString
simpleConduit = mapC process

process :: (StdGen, ByteString) -> ByteString
process (g, bs) =
let rnd = fst $ randomR (40,50) g
in bs ++ pack [rnd]

main :: IO ()
main = do
runResourceT $ sourceInput "test.txt" $$ simpleConduit =$ sinkFile "output.txt"

因此,此示例获取输入文件中的内容并将其写入输出文件,并将 40 到 50 之间的随机 ASCII 值附加到文件末尾。 (别问我为什么)

最佳答案

您可以使用ZipSource为了这。在您的情况下,它可能看起来像:

sourceStdGens :: Source m StdGen
sourceBytes :: Source m ByteString
sourceBoth :: Source m (StdGen, ByteString)
sourceBoth = getZipSource $ (,)
<$> ZipSource sourceStdGens
<*> ZipSource sourceBytes

关于haskell - 管道 - 将多个来源/生产者合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321983/

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