回答:
あなたが求める縮約規則は、IFステートメントの通常の規則です。これは、2つの計算規則と1つのコンテキスト規則で構成されています。
値による呼び出し(厳密)と呼び出しによる要求(遅延)の両方の設定で、 そして 任意の式にすることができます。それらは値である必要はありません。
特定の機能(ここではIF)を削減するこの種のルールは、しばしばデルタルールと呼ばれます。
ここで、上記のステップ(2)が必要な理由は、 適用できます。 引数は3つ必要ですが、元の用語では2つしかないため、削減できません。(Haskellの他の関数と同じように、部分的に適用されています。つまり、引数の一部のみを指定する必要があります。)-expansionは、セマンティクスを変更せずに追加の引数を提供します。
IF FALSE 3 は\x -> IF FALSE 3 x(の部分的な適用IFが許可されていると仮定して)と同等 です。IF FALSE 3値に還元するためにもう1つの引数が必要です。これをx利回りIF FALSE 3 xに適用すると、単純に還元されますx。したがって、型なしラムダ計算を使用している限り、IF FALSE 3実際にと同等\x -> xです。Haskellでこれを試してみると(if' :: Bool -> a -> a部分的に適用できるように関数を定義することにより)、idHaskellがに対して推論する型に特化した関数が得られます3。
IF a b c -> IF a' b c with a-> a'