【发布时间】:2016-05-26 19:21:21
【问题描述】:
我对方案函数式编程真的很陌生。我最近在 lambda 演算中遇到了 Y-combinator 函数,类似于 Y ≡ (λy.(λx.y(xx))(λx.y(xx)))。我想在方案中实现它,我搜索了很多,但我没有找到任何与上述给定结构完全匹配的实现。我找到的其中一些如下:
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
和
(define Y
(lambda (r)
((lambda (f) (f f))
(lambda (y)
(r (lambda (x) ((y y) x)))))))
如您所见,它们与Y ≡ (λy.(λx.y(xx))(λx.y(xx))) 组合函数的结构不匹配。如何以完全相同的方式在方案中实现它?
【问题讨论】:
-
你不能,因为传统的 Y 组合器不适用于应用订单评估。
-
Y ≡ (λy.(λx.y(xx))(λx.y(xx)))版本假定惰性求值。延迟函数评估的一种方法是将函数表达式e包装在(lambda (arg) (e arg))中,因此在这种情况下,函数表达式(procedure procedure)被重写为(lambda (arg) ((procedure procedure) arg))。 -
@AlexKnauth 因此,如果我有一个递归加法函数可以将 0 到 n 数字相加,如下所示:
(define (REC procedure iterations) ( (ISZERO iterations) 0 (+ iterations (procedure (- iterations 1))) ) )我如何在方案中将它与 Y-combinator 一起使用? -
这可能应该是一个单独的问题(而且,我认为您缺少
if)。但一般来说,您会将procedure定义为(Y (lambda (procedure) ....))。 -
也许你应该阅读这个问题:Y combinator discussion in “The Little Schemer”。它说明了为什么只使用
(procedure procedure)不起作用。
标签: scheme lambda-calculus y-combinator