我正在用F#写一个lambda演算,但是我坚持实施beta-reduction(用形式参数代替实际参数)。
(lambda x.e)f
--> e[f/x]
用法示例:
(lambda n. n*2+3) 7
--> (n*2+3)[7/n]
--> 7*2+3
所以我很想听听别人如何解决这个问题的一些建议。任何想法都将不胜感激。
谢谢!
答案 0 :(得分:4)
假设您的表达式表示为
type expression = App of expression * expression
| Lambda of ident * expression
(* ... *)
,你有一个函数subst (x:ident) (e1:expression) (e2:expression) : expression
,用[{1}}中的x
取代e1
的所有免费事件,你想要正常的订单评估,你的代码看起来应该像这样:
e2
let rec eval exp =
match exp with
(* ... *)
| App (f, arg) -> match eval f with Lambda (x,e) -> eval (subst x arg e)
函数应该如下工作:
对于函数应用程序,它应该在两个子表达式上递归调用自身。
对于lambdas,它应该在lambda的body表达式上调用自己,除非 lambda的参数名称等于你想要替换的标识符(在这种情况下你可以保留lambda是因为标识符可以在它里面的任何地方都可以自由出现。)
对于变量,它应该保持变量不变或者替换表达式取决于变量的名称是否等于标识符。