Почему Хаскелл считает лямбда-абстракции в нормальной форме слабой головы (WHNF)?

В Хаскеле лямбды считаются в WHNF, в то время как неприменяемые пользовательские функции - нет. Какова была мотивация этого различия?

1 ответ

Решение

Часто полезно прикрепить информацию к функции, которую необходимо вычислить до того, как вы сможете оценить функцию, но впоследствии ее можно будет разделить между вызовами.

cleverFunction = \x -> simpleCombine x expensiveConstant
 where expensiveConstant = ...
       simpleCombine x c = ...

Обратите внимание, что хотя cleverFunction определяется как лямбда, это не в WHNF из-за where блок (сахар для (\l x -> ...) locBindings).

Лямбда без какой-либо ограждающей области действия не имеет переменных, которые можно было бы вычислить до вызова (переменные в лямбде действительны только для одного вызова и после этого собирают мусор), то есть уже в нормальной форме (фактически NF, а не только WHNF),

Другие вопросы по тегам