回答:
あなたが求める縮約規則は、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
部分的に適用できるように関数を定義することにより)、id
Haskellがに対して推論する型に特化した関数が得られます3
。
IF a b c -> IF a' b c with a-> a'