我有一些代码看起来像这个
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
并返回apiLinks
0。如果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"