lambda - 理解 Scheme 函数

标签 lambda scheme racket

下面的问题是在我们的编程语言练习考试中给出的,我很难理解它是如何工作的。有人能告诉我代码流是什么吗?我已经在 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))) -- 两者 xy .论据 y(f y)因此被忽略。它会被一个自由变量 y 引用。在 lambda 表达式中,但没有。

关于lambda - 理解 Scheme 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549417/

相关文章:

javascript - 通过lambda函数向SQS发送消息时如何插入

scheme - Scheme 中的 foldr 和 apply 有什么区别?

module - Racket 中的模块路径索引是什么

racket - 类型化 Racket 中的自定义哈希集会导致语法对象违反契约(Contract)

scheme - 定义、让和设置之间的区别!

scheme - 如何计算 bool 列表中 true 元素的数量?

python - 为什么 2 个不同的 python lambda 具有相同的字节码?

java - 如何使用 lambda 产品过滤 Java 8 中的嵌套流

Java 8 : modify specific element in the stream by using lambda expressions

scheme - 更改 REPL 以显示用户名、主机名和当前工作目录?