我正在使用 F# 创建 lambda 演算。我目前正试图弄清楚如何实现定点运算符(也称为 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
但正如我所提到的,我很难在我的 lambda 演算中实现定点运算符。这里定义为:
Y = lambda G. (lambda g. G(g g)) (lambda g. G(g g))
有没有人有什么建议?我查看了有关 Y 组合器的其他问题,但找不到任何我能够成功采用的东西。
感谢所有帮助。
编辑:修正了代码中的错字......以前我有Mult
而不是Minus
在受歧视的工会中。有趣的是我才注意到这一点!