我正在七周内从七种语言中学习榆树。以下示例使我感到困惑:
import Keyboard
main = lift asText (foldp (\dir presses -> presses + dir.x) 0 Keyboard.arrows)
foldp
定义为:
Signal.foldp : (a -> b -> b) -> b -> Signal a -> Signal b
在我看来:
- 累加器的初始值
presses
仅0
在第一次评估时main
- 在第一次评估之后,
main
它的初始值似乎presses
是 function 的结果(a -> b -> b)
,或者(\dir presses -> presses + dir.x)
在示例中,是上一次评估的结果。
如果确实如此,那么这是否违反了函数式编程原则,因为 main 现在维护内部状态(或至少foldp
如此)?
foldp
当我在代码中的多个位置使用时,这是如何工作的?它是否保持多个内部状态,每次我使用它时一个?
我看到的唯一另一种选择是foldp
(在示例中)从 0 开始计数,也就是说,每次评估它时,都会以某种方式折叠Keyboard.arrows
. 在我看来,这似乎是非常浪费的,并且肯定会导致长时间运行时出现内存不足的异常。
我在这里错过了什么吗?