2016-11-06 50 views
0

我有幾行代碼在我的家庭作業:爲什麼我們在方案中使用嵌套lambdas?

(define square-a-procedure 
(lambda (f) (lambda (x) (square (f x))))) 

我不明白爲什麼我不能寫爲

(define square-a-procedure (lambda (f x) (square (f x)))) 

我知道這是對的類型,但我不我們真的得到了爲什麼我們一個接一個地參數,而不是一次拿走所有參數。

回答

1

兩個版本都通過生成相同的結果來工作,但返回一個可以在高階函數中使用的部分應用程序。想象一下,你想要添加一個常量並將列表中的元素平方。我們可能用戶的第一個版本輕鬆:

(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) 
0

如果我們一次拿兩個參數,我們不得不在同一時間點拿兩個參數。所以我們函數的用戶必須同時指定兩個參數。

如果我們一次一個參數,我們可以在兩個不同的時間點得到它們。所以我們的函數的用戶可以分別指定函數的每個參數。這更靈活。由於Scheme具有詞彙範圍,因此從外部調用返回的內部lambda「會記住」其創建中使用的參數。這就是閉包,這可以在我們的代碼中建模對象

相關問題