如何在 F# 中实现 beta 缩减函数?
我正在用 F# 编写 lambda 演算,但我一直坚持实现 beta 约简(用实际参数替换形式参数)。
(lambda x.e)f
--> e[f/x]
使用示例:
(lambda n. n*2+3) 7
--> (n*2+3)[7/n]
--> 7*2+3
所以我很想听到一些关于其他人如何解决这个问题的建议。任何想法将不胜感激。
谢谢!
I am writing a lambda calculus in F#, but I am stuck on implementing the beta-reduction (substituting formal parameters with the actual parameters).
(lambda x.e)f
--> e[f/x]
example of usage:
(lambda n. n*2+3) 7
--> (n*2+3)[7/n]
--> 7*2+3
So I'd love to hear some suggestions in regards to how others might go about this. Any ideas would be greatly appreciated.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设您的表达式表示形式类似于
,您有一个函数
subst (x:ident) (e1:expression) (e2:expression) : expression
,它替换所有出现的x 与
e2
中的e1
,并且您想要正常的顺序评估,您的代码应如下所示:subst
函数应按如下方式工作:对于函数应用程序,它应该在两个子表达式上递归地调用自身。
对于 lambda,它应该在 lambda 的主体表达式上调用自身,除非 lambda 的参数名称等于您要替换的标识符(在这种情况下,您可以保留 lambda,因为标识符不会出现自由地在其内部的任何地方)。
对于变量,它应该返回未更改的变量或替换表达式,具体取决于变量的名称是否等于标识符。
Assuming your representation of an expression looks like
, you have a function
subst (x:ident) (e1:expression) (e2:expression) : expression
which replaces all free occurrences ofx
withe1
ine2
, and you want normal order evaluation, your code should look something like this:The
subst
function should work as follows:For a function application it should call itself recursively on both subexpressions.
For lambdas it should call itself on the lambda's body expression unless the lambda's argument name is equal to the identifier you want to replace (in which case you can just leave the lambda be because the identifier can't appear freely anywhere inside it).
For a variable it should either return the variable unchanged or the replacement-expression depending on whether the variable's name is equal to the identifier.