F# を使用してラムダ計算を作成しています。私は現在、固定小数点演算子 (Y コンビネーターとも呼ばれます) を実装する方法を見つけようとして立ち往生しています。
それ以外は順調だと思います。式は、次の判別共用体で表されます。
type Expr =
| Const of int
| Plus of Expr * Expr
| Times of Expr * Expr
| Minus of Expr * Expr
| Div of Expr * Expr
| Neg of Expr
| Var of string
| Fun of string * Expr
| App of Expr * Expr
| If of Expr * Expr * Expr
私のeval
機能はうまくいっているようです。次の例はすべて、期待どおりの結果をもたらします。
例 1:
> eval (Fun("x",Plus(Const 7,Var("x"))));;
val it : Expr = Fun ("x",Plus (Const 7,Var "x"))
例 2:
> eval (App(Fun("x",Plus(Const 7,Var("x"))),Const 3));;
val it : Expr = Const 10
例 3:
> eval (If(Const 0,Const 3,Const 4));;
val it : Expr = Const 4
しかし、前述したように、ラムダ計算内で固定小数点演算子を実装するのが困難です。ここでは次のように定義されています。
Y = lambda G. (lambda g. G(g g)) (lambda g. G(g g))
誰か提案はありますか?Yコンビネータに関する他の質問を見てきましたが、うまく採用できたものは見つかりませんでした。
すべての助けに感謝します。
編集:コードのタイプミスを修正しました...以前は、識別された組合のMult
代わりに持っていました。Minus
ふと気がついたのがおかしい!