Haskell встретит вас на полпути, потому что по сути все является функцией, но переменные связаны только один раз (то есть вы не можете переназначить x
в той же области).
Легко считать y = x + 4
присваиванием переменной, но когда вы посмотрите на y = map (+4) [1..]
(что означает добавление 4 к каждому числу в бесконечном списке от 1 и выше), что теперь будет y
? Это бесконечный список или функция, которая возвращает бесконечный список? (Подсказка: это второй.) В этом случае обработка переменных как функций может быть чрезвычайно полезной, если не абсолютной необходимостью, при использовании лени .
Действительно, в Haskell ваше определение y
- это функция, не принимающая аргументов и возвращающая x+4
, где x
также является функцией, которая не принимает аргументов, но возвращает значение 2.
На любом языке с функциями первого порядка назначение анонимных функций переменным тривиально, но для большинства языков необходимо добавить скобки для обозначения вызова функции.
Пример кода Lua:
x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$ lua x.lua
6
9
Или то же самое в Python (придерживаясь функций первого порядка, но мы могли бы просто использовать простые числа для x
):
x = lambda: 2
y = lambda: x() + 4
print(y())
x = lambda: 5
print(y())
$ python x.py
6
9