我想使用类型的线Wire s e m a b
来处理多个输入。预期的语义是
- 如果输入列表
[]
什么都不做并返回一个空列表 - 如果输入列表是使用输入单
a:as
步执行连线,则使用输入a
递归单步执行生成的连线as
,然后将结果收集到列表中
这是明智的做法吗?我的实施是否明智?这里完全忽略了抑制,这看起来很奇怪。在netwire中创建处理“一次多个事件”的电线的正确方法是什么?
many :: (Monoid s, Monad m) => Wire s e m a b -> Wire s e m [a] [b]
many w = mkGen (\s as -> do
(bs, w') <- go s w as
return (Right bs, many w'))
where go _ w' [] = return ([], w')
go s w' (a:as) = do
(e, w'') <- stepWire w' s (Right a)
(bs, w''') <- go s w'' as
let b = case e of Right r -> [r]
Left _ -> []
return (b ++ bs, w''')