Я не совсем слежу за всеми типами в вашем конвейере, поэтому считаю это черновым наброском, который можно конкретизировать.Во-первых, вы не хотите звонить sequence
слишком рано.Сохраните ваш список IO Bytestring
значений на данный момент.
Далее вам нужна некоторая функция (определенная в терминах filteredTitles . onlyElems . parseXML
), которая принимает single Bytestring
и возвращает IO ()
.Если pPrint
является типом записи, это может быть просто
process :: IO ByteString -> IO ()
process ibs = do
bs <- ibs
pPrint (filteredTitles . onlyElems . parseXML $ bs)
map process (apiLinks >>= simpleHttp)
должно привести к списку типа [IO ()]
.Возможно, это можно было бы переписать не так громко, но теперь мы можем добраться до сути ответа, который использует 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"