我有幾行代碼在我的家庭作業:爲什麼我們在方案中使用嵌套lambdas?
(define square-a-procedure
(lambda (f) (lambda (x) (square (f x)))))
我不明白爲什麼我不能寫爲
(define square-a-procedure (lambda (f x) (square (f x))))
我知道這是對的類型,但我不我們真的得到了爲什麼我們一個接一個地參數,而不是一次拿走所有參數。
我有幾行代碼在我的家庭作業:爲什麼我們在方案中使用嵌套lambdas?
(define square-a-procedure
(lambda (f) (lambda (x) (square (f x)))))
我不明白爲什麼我不能寫爲
(define square-a-procedure (lambda (f x) (square (f x))))
我知道這是對的類型,但我不我們真的得到了爲什麼我們一個接一個地參數,而不是一次拿走所有參數。
兩個版本都通過生成相同的結果來工作,但返回一個可以在高階函數中使用的部分應用程序。想象一下,你想要添加一個常量並將列表中的元素平方。我們可能用戶的第一個版本輕鬆:
(define (add4 n)
(+ n 4))
(map add-4-and-square
(square-a-procedure add4)
'(0 1 2 3)) ; ==> (16 25 36 49)
你的第二個,我們不能這樣做,除非我們把它包在一個lambda,實際上做了完全一樣的第一個。我們經常在沒有考慮的情況下進行部分應用:
(map (lambda (n) (+ n 4)) '(1 2 3)) ; ==> (5 6 7)
如果我們一次拿兩個參數,我們不得不在同一時間點拿兩個參數。所以我們函數的用戶必須同時指定兩個參數。
如果我們一次一個參數,我們可以在兩個不同的時間點得到它們。所以我們的函數的用戶可以分別指定函數的每個參數。這更靈活。由於Scheme具有詞彙範圍,因此從外部調用返回的內部lambda「會記住」其創建中使用的參數。這就是閉包,這可以在我們的代碼中建模對象。