Почему Хаскелл считает лямбда-абстракции в нормальной форме слабой головы (WHNF)?
В Хаскеле лямбды считаются в WHNF, в то время как неприменяемые пользовательские функции - нет. Какова была мотивация этого различия?
1 ответ
Решение
Часто полезно прикрепить информацию к функции, которую необходимо вычислить до того, как вы сможете оценить функцию, но впоследствии ее можно будет разделить между вызовами.
cleverFunction = \x -> simpleCombine x expensiveConstant
where expensiveConstant = ...
simpleCombine x c = ...
Обратите внимание, что хотя cleverFunction
определяется как лямбда, это не в WHNF из-за where
блок (сахар для (\l x -> ...) locBindings
).
Лямбда без какой-либо ограждающей области действия не имеет переменных, которые можно было бы вычислить до вызова (переменные в лямбде действительны только для одного вызова и после этого собирают мусор), то есть уже в нормальной форме (фактически NF, а не только WHNF),