請解釋這個代碼:解釋這個代碼
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;
的是這些技術的名字嗎?
請解釋這個代碼:解釋這個代碼
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;
的是這些技術的名字嗎?
如果伴隨着幾個類似的重載,第一個代碼片段纔有意義。這可能只是完成一套叫做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是綁定一個參數的一種非常簡單的方法,如上面的例子所示。所以我不確定「咖喱」方法庫有多廣泛使用。 =>
運營商更清晰,更笨重,更強大和可讀,並已內置。
+1謝謝你的好例子。 – 2010-03-08 16:06:42
var result = SubtractOne(5);
Assert.AreEqual(4, result);
這是一種新的語言功能,稱爲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);
那麼,在這種情況下,它是等價的......但不是在一般情況下,因爲lambda表達式(和C#2.0匿名代理)可以捕獲本地變量,這在C#1.0中是不可能的 – 2010-03-08 14:58:35
第一樣品是有效無操作作爲輸入功能已經在咖喱形式;它只是給呼叫增加了一個額外的間接級別。如果您對咖喱感興趣,請以the information on Wikipedia作爲起點。
第二個示例創建一個名爲SubtractOne
的lambda expression,它將從傳遞的參數中減去一個。
第二個是函數式編程的東西..現在不記得名字了。 – Earlz 2010-03-08 14:41:11
問題到底是什麼? – 2010-03-08 14:42:34
這種技術的名稱是什麼? – 2010-03-08 14:45:17