Я узнаю о 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. Мне кажется, что это очень расточительно и обязательно вызывает исключения из-за памяти в течение длительного времени.
Я что-то пропустил?