lambda - 理解方案代码的结果

标签 lambda functional-programming scheme closures

我最近一直在研究方案,并获得了以下代码示例。

(define f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))) 
(define e (lambda (x) (* x 3))) 
(define d (f e)) 
(d 4) 

输出为

=> 72

如果有人可以向我提供解释器如何逐步处理此代码并生成结果的概要,这将有助于帮助我理解这种语言。

我的理解非常基本,让我失望的是 (d 4) 因为我认为(最初)(define d (f e)) 有两个参数。我一直在阅读在线链接中的 Material ,但似乎找不到我正在寻找的正确解释。

最佳答案

我将用 substitution model 来解释这一点。这个想法是,您可以用变量的定义替换变量,用过程主体中的表达式替换过程应用程序,并将形式参数扩展到它的参数。例如:

(define square (lambda (x) (* x x)))
(square 5)

因此我们从 (sqrt 5) 开始,因为它启动进程(不是定义)

(square 5)               ; ==> subst square 
((lambda (x) (* x x)) 5) ; ==> apply x=5
(* 5 5)                  ; ==> 25

现在让我们对您的示例执行相同的操作:

(定义 f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))) (定义 e (lambda (x) (* x 3))) (定义 d (f e)) (d 4)

或者我们可以从 d 开始,因为它的定义是一个表达式 (f e):

(f e) ; subs f ==>
((lambda (g) (lambda (x) (g (+ (g x) (g x))))) e)   ; apply g=e ==>
(lambda (x) (e (+ (e x) (e x))))                    ; subst first e ==>
(lambda (x) ((lambda (x) (* x 3)) (+ (e x) (e x)))) ; apply x=(+ (e x) (e x)) ==>
(lambda (x) (* (+ (e x) (e x)) 3))                  ; subst e+apply x=x ==>
(lambda (x) (* (+ (* x 3) (* x 3)) 3))              ; now this is d

因此实际上 fe 现在是无关紧要的,因为根据替换规则,您可以编写 (define d (lambda (x) (* (+ ( * x 3) (* x 3)) 3)) 代替。 然后我们使用新定义执行 (d 4):

(d 4)                                      ; subst d ==>
((lambda (x) (* (+ (* x 3) (* x 3)) 3)) 4) ; apply x=4 ==>
(* (+ (* 4 3) (* 4 3)) 3)                  ; ==> 72

我已经手动完成了此操作,但您可以为 DrRacket 中的简单方案代码自动完成此操作。在左下角下拉菜单中选择“中级学生”作为语言,然后按STEP >|。您的代码有 13 个步骤。但是,手动执行几次以掌握窍门会有所帮助,并且在观看 SICP videoes 后您会更好地理解。如果你完成了questions in the book,你就会变得非常好。书籍和视频都是免费的,因此您只需支付时间即可获得成功。

关于lambda - 理解方案代码的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23670097/

相关文章:

python - 使用 lambda 表达式统计我对 Python 感兴趣的元素

javascript - FP 替代 JavaScript/ReactJS 中的多态性

list - Scala 中是否有 - -(减号)运算符?

list - 方案:从列表中删除重复的号码

time-complexity - 什么是增长顺序以及如何计算它?

c++ - 这个c++模板函数有什么问题

lambda - CUDA 推力快捷数学函数

io - Agda:无法执行 IO - 缺少 Data.FFI、IO.FFI

scheme - ((1 2) 3) 和 ((1 2) . 3) 一样吗?

python - 要么对数值进行操作,要么用 nan 替换单元格