簡體   English   中英

為流媒體庫的每個塊添加延遲?

[英]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的返回值,在這種情況下,這是我們想要的。

我們不想產生更多的元素,而只是引入延遲效果,因此我們只是將效果liftIOStream 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM