Я использую 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
в дискриминируемом объединении. Забавно, что я только что это заметил!