Я смотрю на пакет пакетов 3.0 для обработки потока. Учебник очень хорошо сделан и очень ясен, за исключением того, что я не могу обернуть голову вокруг раздела "zip and merge".
Моя цель - объединить трубы, похожие на ArrowChoice:
- У меня есть уникальный производитель Либо a
- Я хотел бы применить первый канал к значениям Left, а другой - к значениям Right
- Затем мне хотелось бы объединить результаты и продолжить работу с трубопроводом
+----------+ +------+ - filterLeft -> pipe1 -> +------------+
| producer | - (Either a a) -> | fork | | mergeD (?) |
+----------+ +------+ - filterRight -> pipe2 -> +------------+
Я определяю fork
как в учебнике:
fork () =
runIdentityP . hoist (runIdentityP . hoist runIdentityP) $ forever $ do
a <- request ()
lift $ respond a
lift $ lift $ respond a
oddOrEven x = if odd x then Left x else Right x
producer = fromListS [1..0] >-> mapD oddOrEven
isLeft (Left _) = True
isLeft (Right _) = False
isRight = not . isLeft
filterLeft = filterD isLeft
filterRight = filterD isRight
pipe1 = mapD (\x -> ("seen on left", x))
pipe2 = mapD (\x -> ("seen on right", x))
p1 = producer >-> fork
Проблема в том, что я не могу сделать типы правильными. В учебнике показано только, как запустить внутреннюю (поднятую) цепочку труб как самостоятельную сессию, но я хотел бы иметь возможность повторно вводить ее значения в канал, а не просто влиять на них. Я, конечно, старался следовать этим типам, но они очень быстро причесались.
Может ли кто-нибудь помочь мне в этом? Спасибо заранее.
(PS: пример такого типа топологии был бы хорошим дополнением к учебнику, или даже лучше раздел о том, как эмулировать материал Control.Arrow
, используя каналы)