下面的问题是在我们的编程语言练习考试中给出的,我很难理解它是如何工作的。有人能告诉我代码流是什么吗?我已经在 Racket 中运行它并且知道答案是什么。看起来第一个 lambda 函数将其他两个函数作为参数。但是输入在哪里 (lambda (x) 2)
和 (lambda (y) 3)
传递给?(((lambda (x y) (x y))
(lambda (y) (lambda (y x) (x (x y))))
(lambda (x) (lambda (x y) (x (y x)))))
(lambda (x) 2)
(lambda (y) 3))
问题的答案是 3。
最佳答案
我们人类喜欢给事物命名。带有短名称的简洁表示法可以很容易地在心理上操纵代码,因为我们的很多心理能力都与我们的大规模并行视觉识别系统相关联:
(((lambda (x y) (x y))
(lambda (y) (lambda (y x) (x (x y))))
(lambda (x) (lambda (x y) (x (y x)))))
(lambda (x) 2)
(lambda (y) 3)) =>
((u where u = (lambda (x y) (x y))
f f = (lambda (y) (lambda (y x) (x (x y))))
g) g = (lambda (x) (lambda (x y) (x (y x))))
(lambda (x) 2)
(lambda (y) 3)) =>
((u where (u x y) = (x y)
f (f y) = \(y x) -> (x (x y)) ; (*)
g) (g x) = \(x y) -> (x (y x))
(lambda (x) 2)
(lambda (y) 3)) =>
((f where (f g) = \(y x) -> (x (x y))
g) (g x) = \(x y) -> (x (y x))
(lambda (x) 2)
(lambda (y) 3)) =>
(h where h = \(y x) -> (x (x y))
p p = \(x) -> 2
q) => q = \(y) -> 3
(h where (h y x) = (x (x y))
p (p x) = 2
q) => (q y) = 3
(q (q p)) where (p x) = 2
(q y) = 3
=>
(q 3) where (q y) = 3
=>
3
(*)
定义将所有变量绑定(bind)在 lambda 表达式 (lambda (y x) (x (x y)))
-- 两者 x
和 y
.论据 y
在 (f y)
因此被忽略。它会被一个自由变量 y
引用。在 lambda 表达式中,但没有。
关于lambda - 理解 Scheme 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549417/