import Keyboard
main = lift asText (foldp (\dir presses -> presses + dir.x) 0 Keyboard.arrows)
Run Code Online (Sandbox Code Playgroud)
foldp 定义为:
Signal.foldp : (a -> b -> b) -> b -> Signal a -> Signal b
Run Code Online (Sandbox Code Playgroud)
在我看来:
presses仅0在第一次评估时mainmain,似乎初始值presses是函数的结果(a -> b -> b),或者(\dir presses -> presses + dir.x)在示例中,是在先前的评估中.如果确实如此,那么这不是违反函数式编程原则,因为main现在维持内部状态(或者至少foldp是这样)吗?
当我foldp在代码中的多个位置使用时,这是如何工作的?它是否保留多个内部状态,每次使用一个状态?
我看到的唯一另一种选择是foldp(在示例中)从0开始计数,也就是说,每次评估它,并以某种方式折叠由提供的整个历史记录Keyboard.arrows.在我看来,这非常浪费,并且肯定会导致长时间运行时出现内存异常.
我在这里错过了什么吗?