簡體   English   中英

Lambda內部函數定義方案

[英]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表達式高階函數

Lambda表達式

在Scheme / Racket中,函數是普通值,就像數字或列表一樣。 要創建數字,只需輸入數字即可,例如325 要創建列表,請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM