2012-04-27 25 views
2

這是一個家庭作業:方案,將lambda作爲函數參數 - 需要幫助理解ARGS

返回包含滿足給定謂詞指定列表中的所有元素的列表。例如,

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) 

應該返回(3 2 4)。

我昨天剛剛開始計劃,所以我是一個完整的noob。如果我正確理解這個函數函數調用的語法,那麼「filter」是函數,「(lambda(x)(< x 5)」是參數。這與java中的匿名函數類似嗎?

編輯:

我發現了一些代碼從計算器另一篇文章中他們只是直出回答了這個問題:這是他們寫的東西:

(define (my-filter pred lst) 
    (cond ((null? lst) null) 
     ((pred (first lst)) 
      (cons (first lst) (my-filter pred (rest lst)))) 
     (else (my-filter pred (rest lst))))) 

這是很好的,和它的作品,但在此之前我使用任何我想了解它。「pred」是一個函數,但在這種情況下,它們正在傳遞(< x 5)到它,它是如此莫名其妙地接受這個價值。我不明白。

有人可以向我解釋在這個程序中會發生什麼?我不明白正在發生的事情背後的邏輯。

+2

只是一個迂腐的筆記。 Java沒有匿名函數。它有匿名類,通常用於模擬「lambda」。 – 2012-04-27 01:33:21

+0

歷史記錄:在2012年,Java沒有匿名函數(也稱爲「閉包」)......但從Java 8(iirc)開始,它現在可以實現。 – 2017-07-11 07:46:54

回答

1

是的,你在調用filter函數,其中一個參數是(lambda (x) (< x 5))。 (還有另外一個參數,你的數字列表。)是的,它非常類似於Java中使用單一方法的匿名類。

1

是的,lambda在方案中定義了一個函數。如果函數沒有按名稱分配給變量,那麼它與匿名函數基本相同。

5

其他答案是點亮的。此外,如果是對您有所幫助,這個計劃意味着同一件事:

#lang racket 

(define (less-than-five x) (< x 5)) 

(filter less-than-five '(3 9 5 8 2 4 7)) 

計劃/球拍和Java之間的關鍵區別就在這裏是

less-than-five 

是一個值;在Java中,方法不是值。

編輯:我看到你添加了一堆到你的問題。我印象深刻的是你有 後續問題,而不是僅僅考慮你得到了什麼:)

我認爲要回答這個最好的辦法是把重點放在什麼發生在你 進行函數調用,並使用步進機!

哦,到底是什麼。我做了一個視頻,並打了它在YouTube上:

http://youtu.be/2hmamosiqGI

+0

對不起,因爲我是一個菜鳥,所以我無法獲得格式化權利,所以我只是在回答中發佈。 – FatAdama 2012-04-27 02:16:16

+0

我喜歡它,stackoverflow符合可汗學院 – gcbenison 2012-04-28 05:00:42

+0

感謝您的視頻,這是非常有益的。 – 2017-07-10 16:40:22

0

下面是使用谷歌的番石榴庫中的Java問題的一個簡單的例子:

Iterables.filter(asList(3,9,5,8,2,4,7), new Predicate<Integer>() { 

    @Override 
    public boolean apply(Integer a) { 
     return a < 5; 
    } 

}); 

我把它給證明Java沒有匿名函數,而是匿名類。 Java不具備第一類數據類型的功能。我提出這個問題,因爲如果你選擇了一門課程(我認爲你是這樣的),那麼很可能會在考試中提出這個問題。