次のように、引数に適用される通常の関数:
(\x y -> x + 1 : y) 1
を与えるために減らすことができます:
\y -> 1 + 1 : y
最初の式では、「最も外側」のものはアプリケーションだったので、WHNF にはありませんでした。2 番目に、最も外側のものはラムダ抽象化であるため、WHNF にあります (関数本体内でさらに削減を行うことはできますが)。
ここで、組み込み (プリミティブ) 関数の適用を考えてみましょう。
(+) 1
1
これは組み込みであるため、最初のパラメーターを置き換えることができる関数本体はありません。(+)
評価者は、 などの の完全に「飽和した」アプリケーションを評価する方法を「知っている」だけ(+) 1 2
です。しかし、部分的に適用されたビルトインでできることは何もありません。「(+) を 1 に適用し、もう 1 つの引数を待つ」というデータ構造を作成することしかできませんが、削減しようとしているのはまさに. だから私たちは何もしません。
ビルトインは、ラムダ計算式で定義されていないため特別です。そのため、リダクション プロセスはそれらの定義の「内部を見る」ことができません。したがって、通常の関数アプリケーションとは異なり、組み込み関数アプリケーションは、完全に「飽和」するまで引数を蓄積するだけで「縮小」する必要があります (この場合、WHNF への縮小は、組み込みの魔法の実装が何であれ実行することによって行われます)。 . 飽和していないビルトイン アプリケーションはこれ以上減らすことができないため、既に WHNF に含まれています。