[英]Append a delay to each chunk with the streaming library?
這里是Streaming和Haskell的新手。
我一直在研究流媒體庫,並且對理解塊部分特別感興趣。 例如:
S.print $ S.delay 1.0 $ concats $ chunksOf 2 $ S.each [1..10]
要么:
S.print $ concats $ S.maps (S.delay 1.0) $ chunksOf 2 $ S.each [1..10]
在這里,我可以在每個元素之后引入一個延遲,但是我想要在每個塊之后添加一個延遲,在這種情況下,是每第二個元素延遲一個。 我試過了,但是沒有編譯:
S.print $ concats $ S.delay 1.0 $ chunksOf 2 $ S.each [1..10]
我該如何實現?
我們需要的功能是在塊流的末尾插入單個延遲,然后將該功能傳遞給maps
。
delay
在這里不起作用,因為它在每個產生的值之間放置了延遲。 但是我們可以使用Applicative
函數輕松地做到這一點:
S.print
$ concats
$ S.maps (\s -> s <* liftIO (threadDelay 1000000))
$ chunksOf 2
$ S.each [1..10]
這是怎么回事 maps
將轉換應用於Stream
的“基本函子”。 在通過chunksOf
獲得的“塊流”中,該基本函子本身就是Stream
。 同樣,轉換必須保留Stream
的返回值。
Stream
S可與類似功能的被測序(>>=) :: Stream fma -> (a -> Stream fmb) -> Stream fmb
如果下一個流依賴於前面一個的最終結果,或與類似功能的(<*) :: Stream fma -> Stream fmb -> Stream fma
如果沒有)。 (<*)
保留第一個Stream
的返回值,在這種情況下,這是我們想要的。
我們不想產生更多的元素,而只是引入延遲效果,因此我們只是將效果liftIO
到Stream
monad中。
在Stream
每個產生的值之后插入延遲的另一種方法是使用無限的延遲列表 壓縮它 :
delay' :: MonadIO m => Int -> Stream (Of a) m r -> Stream (Of a) m r
delay' micros s = S.zipWith const s (S.repeatM (liftIO (threadDelay micros)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.