Haskell-在Prelude.sequence函数的结果之间插入线程dealy



我有一些代码看起来像这个

listOfIOByteStrings = simpleHttp <$> apiLinks :: [IO ByteString]

其中CCD_ 1是调用某些API函数的链接列表。

我也有这个功能

z = sequence listOfIOByteStrings

sequence具有这样的类型序列::Monad m=>t(m1(->m(t/a(

我想做的是在每个ByteString的求值之间添加一个线程延迟。

我正在考虑使用threadDelay线程延迟::Int->IO((

这就是我最终要做的

listOfContent <- z
pPrint $ filteredTitles . onlyElems . parseXML <$> listOfContent

其中

parseXML::ByteString->[Content]

onlyElems::[内容]->[元素]

filteredTitles :: [Element] -> [String]

在序列结果之间应用线程延迟类似于

printing (filteredTitles . onlyElems . parseXML (bytestring of link1))... 
delay of 1 sec...
printing (filteredTitles . onlyElems . parseXML (bytestring of link2))... 
delay of 1 sec...
printing (filteredTitles . onlyElems . parseXML (bytestring of link3))... 
delay of 1 sec...

我不知道该怎么做。

其中一种方法是使用forM_作为

...
do listOfContent <- z
forM_ listOfContent $
content -> do pPrint $ (filteredTitles . onlyElems . parseXML) content
threadDelay 1000000

我不太了解您的管道中的所有类型,所以请将其视为一个可以充实的粗略草图。首先,您不想过早地调用sequence。暂时保留您的IO Bytestring值列表。

接下来,您需要一些函数(根据filteredTitles . onlyElems . parseXML定义(,它接受单个Bytestring并返回apiLinks0。如果pPrint是写入类型,这可能只是

process :: IO ByteString -> IO ()
process ibs = do
bs <- ibs
pPrint (filteredTitles . onlyElems . parseXML $ bs)

CCD_ 12应产生类型为CCD_ 13的列表。这可能可以用一种不那么笨拙的方式重写,但现在我们可以找到答案的核心,即使用intersperse插入线程延迟,然后最终对[IO ()]进行排序以获得IO [()]

import Data.List
let results = map process (apiLinks >>= simpleHttp)
actions = intersperse (threadDelay 1) results 
in sequence actions

intersperse :: a -> [a] -> [a]的工作原理是在第二个参数的每个元素之间插入第一个参数。使用字符串的一个简单示例:

> intersperse '-' "abc"
"a-b-c"

最新更新