Я играю с библиотекой каналов и написал образец кода для извлечения двух чисел (2 & 3), когда они появляются в последовательности. Ниже мой код:Кабель: извлечение последовательных номеров
import Data.Conduit
import qualified Data.Conduit.List as CL
source = CL.sourceList [1,2,3,4,5,2,3] :: Source IO Int
-- Extract the consequent 2 and 3 number
extract23 :: Conduit Int IO Int
extract23 = do
a <- await
b <- await
case (a,b) of
(Just a,Just b) ->
if a == 2 && b == 3
then do yield a
yield b
extract23
else extract23
_ -> return()
conduit1 :: Conduit Int IO String
conduit1 = CL.map show
sink1 :: Sink String IO()
sink1 = CL.mapM_ putStrLn
main :: IO()
main = source $= (extract23 =$= conduit1) $$ sink1
Но когда я выполняю функцию main
, я не получаю никакого вывода. Я ожидаю, что на самом деле это примерно так:
2
3
2
3
Любая идея о том, что я делаю неправильно?
Спасибо, что решил проблему. Но что, если я захочу увидеть третий элемент в потоке? Как обращаться в этом случае? 'peek', похоже, не работает в этом случае. – Sibi
Я добавил обновление с более подробным объяснением. –