gpt4 book ai didi

haskell - 如何在 Haskell 中概括从 url 和文件读取

转载 作者:行者123 更新时间:2023-12-03 14:04:27 25 4
gpt4 key购买 nike

我开发了一个应用程序,它通过具有给定偏移量的块从 Internet 借用数据。出于测试目的,我有一个转储文件,其中包含每行对应于单独块的行。我想从 url 和转储文件中概括读取操作。目前,我有以下功能:

getChunk :: DataSourceMode -> Config -> Int -> Int -> IO FetchResult
getChunk DSNormal config ownerId' offset' = do ...
getChunk DSFromFile config ownerId' offset' = do ...

当前实现的问题在于它在每次 getChunk 调用时读取转储文件,而且显然是无效的。第一个想法是将转储文件中的行保存到列表中,但是用来自 url 的读数来概括它并不容易。我想,管道或管道可用于构建块的来源,但我不熟悉这些库;我应该使用其中之一,或者,也许有更好的解决方案?

最佳答案

我最终得到了管道。使用广义函数 processFeed 作为接收器,然后将数据从 postUrlSource 或 Data.Conduit.Binary.sourceFile 插入其中,具体取决于模式。

import Data.Conduit.Binary as CB(sourceFile, conduitFile, lines)

processFeed :: MonadIO m => Config -> OwnerId -> (OwnerId -> [Post] -> IO ()) -> Sink BS.ByteString m FetchResult
processFeed config ownerId' processFn = do ...

postUrlSource :: MonadIO m => Config -> OwnerId -> Source (StateT FetchState (m)) BS.ByteString
postUrlSource config ownerId' = do ...

...

_ <- case (dsMode config) of
DSFromFile -> do
runResourceT $ CB.sourceFile dumpFile $= CB.lines $$ (processFeed config publicId' saveResult)
DSNormal -> do
let postsFromUrlConduit = (postUrlSource config publicId') $$ (processFeed config publicId' saveResult)
fetchedPosts <- runStateT postsFromUrlConduit (FetchState 0 "")
return $ fst fetchedPosts

...

StateT 用于从 url 获取数据的情况,因此,每个块都以新的偏移量获取。
为了从文件中读取它是 IO monad,它只是从转储中顺序读取行。

关于haskell - 如何在 Haskell 中概括从 url 和文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320906/

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