将变换流应用于单个不可变元素/状态。应用仿函数做这样的事情但是有限的功能。它允许您在一个单独的上下文中执行它们,在这种情况下您可以收集错误并让它以失败的状态完成...例如,我对更完整的事情感兴趣。
示例可能是IDE编辑器:应用于编辑器状态的无限转换流。
除了明显的foldLeft / scanLeft与[A => B]元素
答案 0 :(得分:3)
将单个转换应用于无限的元素流
是地图。
map f [1..]
将转换流应用于单个不可变元素/状态
仍然是地图:)
map (`apply` x) [f, g, h ..]
其中
f `apply` x = f x
并且行动的顺序更加丰富。并且您可能拥有自定义apply
功能,其功能不仅仅是功能应用程序。并且可能存在一些累积状态,因此它是一个地图和一个折叠。具有丰富的传入流语义。
这是一名"翻译"图案。
所以你首先要定义可能的行动:
data Exp
= Action1
| Action2 Int Bool
| Action3 ...
和一个解释每个动作的评估者,有一些状态:
eval :: State -> Exp -> IO (State, Either Error Result)
eval st Action1 = .. do something ..
eval st (Action2 x b) = .. do something else
然后最后在循环中运行它。您的行动map
。
go :: State -> [Exp] -> IO ()
go st (act:acts) = do
(st', er) <- eval st act
case er of
Error x -> .. fail ?
Result y -> .. success
go st' acts
你正在路上。