Думайте об этом так: все представлено фрагментом кода («thunk»), который должен вызываться напрямую, чтобы получить результат.Когда вы пишете литерал 1
, он компилируется в кусок кода, который при вызове возвращает 1 (на самом деле, fromIntegral 1
), и этот фрагмент кода затем используется вместо литерала 1. Это также является ключом клень: вместо того, чтобы что-то вычислять немедленно, создается thunk, который при вызове будет делать вычисления.Если вы передадите это выражение в другую функцию, это будет обработчик, который будет передан, и поэтому вычисление не будет выполняться до тех пор, пока / или что-то не понадобится явно проверить его результат.
В Haskell приложения функций представлены одинаковоway: thunk, который обрабатывает один параметр и возвращает thunk, который либо обрабатывает следующий параметр, либо выдает результат.Таким образом, (1+)
является приложением функции (+) 1
: (+)
- это thunk, который ожидает, что ему будет передано одно число, и возвращает thunk, который ожидает, что ему будет передано еще одно число.Поскольку (+)
является строгим, этот второй блок фактически добавляет, а не возвращает блок, который должен быть вызван для фактического добавления.Таким образом, (1+)
оценивает этот второй поток, который должен быть вызван с другим номером, который будет предоставлен map
, поскольку он повторяется по list
.