かを実装する固定点のオペレーター(Y combinator)F#?
-
28-09-2019 - |
質問
を使用していF#をラムダ計算.私は現在、こだわったそうとしていることをどのように実施の固定点のオペレーターとも呼ぶに対するY combinator).
と思うんです。現代の差別を受けた。
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 combinatorできなかったかもしれませんので、何とに成功します。
すべての援よろしくお願いいたします。
編集: Typoのコー---従っ Mult
の代わりに Minus
の差別を受ける。もうっ!
解決
あなたが言及しているバージョンは怠zyな言語でのみ機能し、あなたの言語が怠zyな評価戦略を使用していない場合、あなたは無限のループに閉じ込められます。これを翻訳してみてください:
Y = lambda G. (lambda g. G(lambda x. g g x)) (lambda g. G(lambda x. g g x))
他のヒント
してましたけれども、私の記憶では、全体のクラスのY Combinatorsにuntypedラムダ計算で取得しでは取り組むことが難しいものが言語には厳しく入力が人々のためにはない特別な場合にはMLのものF#.ていることに対して非常に有用な場合語再帰支援(ラムダ計算しない).というものが議論の話題がるStackoverflowが<日本語仮抄訳>欧州連セージ"プログラミング"又はMLもあると思うが、一見するた: