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