2010-05-31 39 views
4

我真的很感興趣如何使用lambda功能。在像php這樣的現代高級編程語言中使用它們有意義嗎?如果是,爲什麼?Lambda功能

這真的只是一個嵌入函數的函數(like this)還是有更多的功能?

+1

@Donal:感謝合併,我打算這樣做,但刷新了編輯歷史,你已經做到了。 (我們確實需要一些[技術措施](http://meta.stackexchange.com/questions/6495/preventing-conflicting-simultaneous-edits/46118#46118)來幫助。) – 2010-05-31 07:44:54

+0

@Roger:同意。有時,當我進行長時間的編輯時,我會得到一個頂部通知,說明有些事情發生了變化,但這與兩個人同時做短小模組的時間並不相同。他們只是碰撞。 – 2010-05-31 07:49:37

回答

7

拉姆達項代表作爲的函數。它可以完全作爲一個值來傳遞(因爲它是一個),並通過給它一些參數來應用。命名函數只是映射到lambda項的名稱,可以是常量或變量(取決於語言的詳細信息)。

是的,它們在高級編程語言中非常普遍。例如,JavaScript中的所有函數實際上都是存儲在變量中的lambda表達式。

5

lambda函數是一個對象(或值)。它可以作爲參數傳遞給另一個函數,或從一個函數返回。

map(lambda x: x**2, [1,2,3,4]) 

它不需要名稱;當你創建一個(例如Python)lambda x: x**2時,你有lambda函數。與傳統的比較:

def square(x): 
    return x**2 

也許最重要的是,您可以在運行時構造它們。

def make_exp_function(n): 
    return lambda x: x**n 

square = make_exp_function(2) 
cube = make_exp_function(3) 
for i in range(100): 
    f = make_exp_function(i) 
    print f(2) 
+0

我必須補充一點,這是一個非常低調的觀點。 這意味着您可以以比EVAL更高效的方式動態創建代碼。 它使得像抽象工廠這樣的編程更容易。 – MER 2013-11-21 23:44:38

2

它基本上語法制糖,你會在10日線與代表和你有什麼話,可以在單行lambda表達式做寫什麼。對於我來說,主要考慮的事情是與同一個項目中的多個開發人員一起工作時,您必須確保其可讀性仍然清晰。

你可以附加一個事件直列 Button1_Click += (sender, eventArgs) => { //myCode };

但你不能夠再利用的情況下,如果有大量的代碼在那裏,它不會讓你的代碼TRANSPARANT幫助。

您也可以創建一個lambda來從列表<>中檢索數據,但是當有很多參數時,可能會變得相當不清楚,其中一個很好的LINQ查詢可以更加清晰。

這主要是個人的選擇,但我必須說,我已經使用了好幾次:)

希望這有助於一點, 山姆

5

雖然PHP支持匿名函數,它們實際上不是關閉 - 所以你想念最有趣的部分。

在JavaScript(以及支持「lambda」的語言爲正確方式)中,您可以從函數返回一個函數,並且返回的函數即使在外部函數執行完畢後也能夠訪問封閉上下文。例如:

function counter(start){ 
    return function() { 
     return start++; 
    }; 
}; 

var f = counter(1); 
alert(f()); // now it's 1 
alert(f()); // now it's 2 
alert(f()); // now it's 3 
var g = counter(10); 
alert(g()); // now it's 10 
alert(g()); // now it's 11 
alert(f()); // now it's 4! 
+0

關閉的+1 – Luc 2010-05-31 08:33:00

+3

雖然匿名函數默認情況下不是關閉,但PHP確實支持顯式關閉創建(關鍵字爲「use」)。在http://blog.igstan.ro/2009/04/lambdas-and-closures-in-php-53.html – 2010-05-31 08:56:42

+0

查看更多酷,我不知道。語法有點難看,但很高興看到PHP迎頭趕上。 – mishoo 2010-05-31 09:25:31

3

大約有拉姆達函數的兩個重要的東西(至少在方式術語常用):

  1. 它們可以通過周圍。函數可以將lambda函數作爲參數或返回lambda函數。

  2. 他們可以訪問他們定義的範圍。所以,例如,lambda函數可以訪問封閉函數的參數。

有關如何,這是有用的一個基本的例子,我會寫在Ruby filter功能:

def filter(array, &lambda_function) 
    new_array = [] 
    for item in array 
    new_array.push(item) if lambda_function[item] 
    end 
    return new_array 
end 

$people_array = #imagine I have an array of Person objects here 

def find_people_richer_than(threshold) 
    return filter($people_array) {|person| person.wealth >= threshold} 
end 

我們filter不知道我們將要使用的篩選標準是什麼。該邏輯全部包含在我們傳入的塊(Ruby的版本的lambda函數)中。但請注意,即使實際上在filter內調用了lambda函數,它仍然知道定義它的閾值。