Разница между нетерпеливым и ленивым вычислением в нефункциональном языке, таком как JavaScript? - PullRequest
0 голосов
/ 18 февраля 2019

В функциональном программировании я узнал, что ленивая оценка и рьяная оценка дают один и тот же результат (Языки программирования: книга приложений и интерпретации).Таким образом, можно изменить семантику оценки, не получив неожиданных результатов.

Однако в нефункциональном и промышленном языке программирования, таком как JavaScript, я не думаю, что обе семантики генерируют результат.Например, если метод object.f(x) возвращает значение, которое зависит от состояния объекта (например, время жизни), ленивая и энергичная оценка может возвращать разные значения.Кроме того, в функциональном программировании мы также можем получить другой результат, если функция f(x) вернет значение, которое зависит, например, от температуры процессора.

Итак, ленивая и энергичная оценка потенциально приведет к разным результатам?Даже на функциональном языке программирования.

1 Ответ

0 голосов
/ 04 марта 2019

В функциональном программировании я узнал, что ленивая оценка и нетерпеливая оценка дают один и тот же результат (Языки программирования: книга приложений и интерпретации).Таким образом, можно изменить семантику оценки без неожиданных результатов.

Вышеприведенное утверждение неверно.Ленивая оценка и рвение не всегда дают один и тот же результат, и следующий пример это подтверждает.Код Haskell (ленивая оценка):

> let forever x = forever x
> const 10 (forever 20)
10

Код OCaml (жадная оценка):

# let const a b = a;;
val const : 'a -> 'b -> 'a = <fun>
# let rec forever x = forever x;;
val forever : 'a -> 'b = <fun>
# const 10 (forever 20);;
^CInterrupted.

Как вы можете видеть, это же выражение дает результат 10 на ленивом языкетогда как в нетерпеливом языке это входит в бесконечный цикл.

...