:何がやりたいことはあなたのa
関数にx
を供給し、それはあなたがあなたの最初の試みでやったことだですラムダ計算を実行し、手動で減量を行います(使用している減量に注意してください)。あなたはまだあなたの例の場合には、これはなるので
ラムダ計算の簡易版としてOCamlの構文を使用することができます。
let test a x = ((fun a -> a) x);;
=> let test a x = ((fun b -> b) x);; (* Variable renamed (alpha equivalence) *)
=> let test a y = ((fun b -> b) y);; (* Variable renamed (alpha equivalence) *)
let func x = x + x;;
これらの手順のみを確認するのに役立つことに注意してください、私たちは後になること異なる名前を参照して、同じ名前の変数はありません。これらのステップは省略することができますが、私は個人的には一意の変数を使う方がはるかに優れています。
test func 5
=> test (fun x -> x + x) 5 (* Variable func inserted (beta reduction) *)
=> (fun a y -> ((fun b -> b) y) (fun x -> x + x) 5 (* Variable test inserted *)
=> (fun y -> (fun b -> b) y) 5 (* Variable a inserted *)
=> ((fun b -> b) 5 (* Variable y inserted *)
=> 5 (* Variable b inserted *)
最終結果は5
です。これを最初に試みることは、非常に珍しくて難しいように見えますが、非常に速く簡単になります。このようなことを2,3回行うと、共通の機能パターンを理解し、プログラム構造を推論する上で、はるかに優れたものになります。
詳細については、this articleをご覧ください。
もう少し努力すれば、これも逆に働くことに注意してください。これは通常、コンパイラと同じ方向に行うほど役に立ちませんが。