Ответ 1
Нормальная функция, применяемая к аргументу, такая как:
(\x y -> x + 1 : y) 1
Можно уменьшить, чтобы дать:
\y -> 1 + 1 : y
В первом выражении "внешняя" вещь была приложением, поэтому она не была в WHNF. Во втором случае самая внешняя вещь - абстракция лямбда, поэтому она находится в WHNF (хотя мы могли бы сделать больше сокращений внутри тела функции).
Теперь рассмотрим применение встроенной (примитивной) функции:
(+) 1
Поскольку это встроенный, нет тела функции, в котором мы можем заменить 1
на первый параметр. Оценщик "просто знает", как оценить полностью "насыщенные" приложения (+)
, например (+) 1 2
. Но ничего, что можно сделать с помощью частично встроенного встроенного; все, что мы можем сделать, это создать структуру данных, описывающую "применять (+) до 1 и ждать еще один аргумент", но именно то, что мы пытаемся уменьшить ,. Поэтому мы ничего не делаем.
Встроенные функции являются особенными, поскольку они не определяются выражениями лямбда-исчисления, поэтому процесс сокращения не может "видеть внутри" их определение. Таким образом, в отличие от приложений с обычными функциями, встроенные функциональные приложения должны быть "уменьшены" путем накопления аргументов, пока они не будут полностью "насыщены" (в этом случае сокращение до WHNF осуществляется путем выполнения любой магической реализации встроенного), Ненасыщенные встроенные приложения больше не могут быть уменьшены, и они уже находятся в WHNF.