【发布时间】:2012-02-17 12:03:01
【问题描述】:
F# 提供了一个特性,一个函数可以返回另一个函数。
在 F# 中生成函数的一个例子是:
let powerFunctionGenarator baseNumber = (fun exponent -> baseNumber ** exponent);
let powerOfTwo = powerFunctionGenarator 2.0;
let powerOfThree = powerFunctionGenarator 3.0;
let power2 = powerOfTwo 10.0;
let power3 = powerOfThree 10.0;
printfn "%f" power2;
printfn "%f" power3;
我能想到的在 C# 中实现相同目标的最佳方法是:
class Program
{
delegate double PowerOf2(double exponent);
delegate double PowerOf3(double exponent);
delegate double PowerOfN(double n, double exponent);
static void Main(string[] args)
{
PowerOfN powerOfN = (a, b) => { return Math.Pow(a,b) ; };
PowerOf2 powerOf2 = (a) => { return powerOfN(2, a); };
PowerOf3 powerOf3 = (a) => { return powerOfN(3, a); };
double result = powerOf2(10);
Console.WriteLine(result);
result = powerOf3(10);
Console.WriteLine(result);
}
}
还有其他方法(/更好的方法)吗?
【问题讨论】:
-
我从来没有在 C# 中做过这么多的柯里化,但 lambdas 不会限制柯里化的用处吗? @Ngm;您动态生成方法的原因是什么?
-
没有什么特别的原因,只是想探索一下怎么做。
-
请注意,所有函数都在 F# 中进行了柯里化,因此您可以等效地将
powerFunctionGenerator写成let powerFunctionGenarator baseNumber exponent = baseNumber ** exponent
标签: c# f# functional-programming