Я узнаю о Elm из Семь других языков за семь недель. Следующий пример меня смущает:
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
является тем, что результат функции(a -> b -> b)
или(\dir presses -> presses + dir.x)
в этом примере был на предыдущей оценке.
Если это действительно так, то разве это не является нарушением принципов функционального программирования, так как в настоящее время поддерживается внутреннее состояние (или, по крайней мере, foldp
)?
Как это работает, когда я использую foldp
в нескольких местах в моем коде? Поддерживает ли он несколько внутренних состояний, по одному на каждый раз, когда я его использую?
Единственная альтернатива, которую я вижу, заключается в том, что foldp
(в примере) начинает отсчет от 0, так сказать, каждый раз, когда он оценивается, и как-то складывает всю историю, предоставленную Keyboard.arrows
. Мне кажется, что это очень расточительно и обязательно вызывает исключения из-за памяти в течение длительного времени.
Я что-то пропустил?