[英]Lambda inside function definition Scheme
(define (fn lst)
(filter (lambda (item) (not (symbol=? item 'sym))) lst))
我們傳入lst
,但是在內部(lambda (item) (not (symbol=? item 'sym)))
我們從未使用過變量lst
。 評價?
您發布的代碼片段結合了兩個概念,它們可以單獨解釋(並且可能更有意義): lambda表達式和高階函數 。
在Scheme / Racket中,函數是普通值,就像數字或列表一樣。 要創建數字,只需輸入數字即可,例如3
或25
。 要創建列表,請使用list
功能,例如(list 2 4 6)
。 要創建函數,請使用lambda
表單。
通常,定義函數時,請使用define
。 例如,下面是一個將數字加1的函數:
(define (add1 x)
(+ x 1))
但這實際上只是一種簡寫語法。 寫出以上定義的完整方法如下所示:
(define add1
(lambda (x)
(+ x 1)))
如您所見,它使用lambda
。
如果define
速記更短且更易於閱讀,為什么直接使用lambda
會有用呢? 好吧,要了解這一點,您必須考慮高階函數。
大多數函數采用簡單值並產生簡單值。 例如,上面的add1
函數將數字作為參數並產生一個數字作為結果。 但是,請記住上面我提到過函數也是值。 因此,函數實際上可以接受其他函數作為參數,甚至可以產生其他函數作為結果。 這些功能稱為“高階功能”。
filter
功能是高階功能。 它具有一個函數和一個列表,並使用該函數選擇應將哪些元素保留在結果中。 例如,它可以用於選擇列表中的所有偶數:
> (filter even? (list 1 2 3 4 5))
'(2 4)
注意, even?
是一個函數,並且作為參數傳遞給filter
。 這完全可以,而且實際上非常有用! 方案/球拍中有許多高階函數,而這些函數是“函數”風格編程的重要組成部分。 例如,使用map
函數,您可以提供一個函數以應用於列表的每個元素:
> (map add1 (list 1 2 3 4 5))
'(2 3 4 5 6)
當然,這一切都很好,但是如果您想向列表的每個元素添加一個非1的數字怎么辦? 好吧,您始終可以定義一個添加了正確數量的新函數:
> (define (add25 x)
(+ x 25))
> (map add25 (list 1 2 3 4 5))
'(26 27 28 29 30)
但是,這將是非常愚蠢的。 這就好比您也必須對所有數字都使用define
來命名,而不是直接將其輸入程序中一樣。 對於僅使用一次的小型簡單函數,無需為其命名。 為此,您可以直接使用lambda
表單:
> (map (lambda (x) (+ x 25))
(list 1 2 3 4 5))
'(26 27 28 29 30)
這就是您的問題片段中正在發生的事情。 您可以為內部lambda命名,如下所示:
(define (not-an-apple? item)
(not (symbol=? item 'apple)))
(define (eat-apples lst)
(filter not-an-apple? lst))
但是,在這種情況下,因為有單獨的not-an-apple?
,所以直接內聯編寫函數會更容易not-an-apple?
函數可能不是非常有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.