Добавить задержку к каждому чанку с потоковой библиотекой? - PullRequest
0 голосов
/ 10 июня 2018

новичок в Streaming и Haskell здесь.

Я играл с библиотекой streaming , и мне особенно интересно понять часть чанков.Например:

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]

Как мне этого добиться?

1 Ответ

0 голосов
/ 10 июня 2018

Нам нужна функция, которая вставляет одну задержку в конец потока чанка и передает эту функцию в maps.

delay здесь не работает, потому что он помещает задержки между каждым полученным значением.Но мы можем сделать это легко, используя функции из Applicative:

  S.print 
$ concats 
$ S.maps (\s -> s <* liftIO (threadDelay 1000000)) 
$ chunksOf 2 
$ S.each [1..10]

Что здесь происходит?maps применяет преобразование к «базовому функтору» Stream.В «кусочном потоке», полученном с помощью chunksOf, этот базовый функтор сам по себе является a Stream.Кроме того, преобразование должно сохранять возвращаемое значение Stream.

Stream s может быть упорядочено с помощью таких функций, как (>>=) :: Stream f m a -> (a -> Stream f m b) -> Stream f m b, если следующий поток зависит от конечного результатапредыдущий или с такими функциями, как (<*) :: Stream f m a -> Stream f m b -> Stream f m a, если это не так.(<*) сохраняет возвращаемое значение первого Stream, что нам и нужно в этом случае.

Мы не хотим выдавать больше элементов, а только вводим эффект задержки, поэтому мы простоliftIO эффект в монаде Stream.


Другой способ вставить задержки после каждого полученного значения 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)))
...