2010-03-08 125 views
4

請解釋這個代碼:解釋這個代碼

public static Func<TInput1, TOutput> Curry<TInput1, TOutput>(this Func<TInput1, TOutput> f) 
{ 
    return x => f(x); 
} 

OR

Func<Int32, Int32> SubtractOne = x => x - 1; 

的是這些技術的名字嗎?

+0

第二個是函數式編程的東西..現在不記得名字了。 – Earlz 2010-03-08 14:41:11

+5

問題到底是什麼? – 2010-03-08 14:42:34

+0

這種技術的名稱是什麼? – 2010-03-08 14:45:17

回答

3

如果伴隨着幾個類似的重載,第一個代碼片段纔有意義。這可能只是完成一套叫做Curry的方法。這個詞來自Haskell Curry這個名字,指的是編程語言(或庫)提供一個所需參數的子集給一個函數的能力,以獲得接受其餘函數的另一個函數。它更容易用一個例子就明白了:

void Foo(int a, string b, bool c) { ... } 

您可以致電此提供所有三個參數:

Foo(123, "hi", false); 

但在討好,你可以這樣做:

var foo123 = Foo(123); 

它給你返回另一個函數,它接受剩餘的兩個參數,所以我們說它將第一個參數「綁定」到值123.但是,如果您可以使用原始函數進行咖喱,則可以使用新函數進行咖喱:

var foo123Hi = foo123("hi"); 

最後提供的最後一個參數:

foo123Hi(false); 

最後,我們有三個參數,只有現在確實我們的Foo定義實際上真正執行。

在許多函數式語言中(毫不奇怪,在Haskell和Curry語言中)這是內置於語言中的。在C#中不是這樣,雖然可以部分提供了一組重載如模擬它:

Action<string, bool> Foo(int a) 
{ 
    return (b, c) => Foo(a, b, c); 
} 

Action<bool> Foo(int a, string b) 
{ 
    return c => Foo(a, b, c); 
} 

但是,這仍然是不完全正確的,因爲在第一個例子中,返回Action<string, bool>不會直接咖喱-能夠。

所以有時候會嘗試提供一個咖啡庫來啓用對任何功能的控制。

但是使用足夠簡單的lambda語法,實際上並不清楚任何庫解決方案都會有幫助。畢竟,lambda是綁定一個參數的一種非常簡單的方法,如上面的例子所示。所以我不確定「咖喱」方法庫有多廣泛使用。 =>運營商更清晰,更笨重,更強大和可讀,並已內置。

+0

+1謝謝你的好例子。 – 2010-03-08 16:06:42

1
var result = SubtractOne(5); 
Assert.AreEqual(4, result); 
3

這是一種新的語言功能,稱爲lambda expression

第二個使一個函數,它接受一個Int32命名x並返回一個Int32等於x - 1,則該函數分配給名爲Func<Int32, Int32>委託類型的變量。

這等同於以下的C#1.0代碼:

delegate int MyFunc(int x); 
static int SubtractOneFunction(int x) { return x - 1; } 

MyFunc SubtractOne = new MyFunc(SubtractOneFunction); 
+1

那麼,在這種情況下,它是等價的......但不是在一般情況下,因爲lambda表達式(和C#2.0匿名代理)可以捕獲本地變量,這在C#1.0中是不可能的 – 2010-03-08 14:58:35

8

第一樣品是有效無操作作爲輸入功能已經在咖喱形式;它只是給呼叫增加了一個額外的間接級別。如果您對咖喱感興趣,請以the information on Wikipedia作爲起點。

第二個示例創建一個名爲SubtractOnelambda expression,它將從傳遞的參數中減去一個。