Dav*_*vid 13
来自维基百科
当我们在一张纸上计算某些给定值的函数时,Currying实际上与我们所做的并没有太大的不同.
采取这个功能
f(x,y) = y / x要评估
f(2,3),首先,替换x为2.由于结果是y中的新函数,因此该函数g(y)可以定义为
g(y) = f(2,y) = y / 2接下来,替换
y参数3,提供结果,
g(3) = f(2,3) = 3 / 2.在纸面上,使用经典符号,只是我们似乎同时做到这一切.但是,实际上,当在一张纸上替换参数时,它是按顺序进行的(即部分地).每次替换都会导致函数内的函数.当我们按顺序替换每个参数时,我们将函数简化为更简单和更简单的原始版本.最终,我们最终得到了lambda演算中的一系列函数,其中每个函数只接受一个参数,而多参数函数通常以curry形式表示.
currying的实际动机是,通常通过向curried函数(通常称为部分应用程序)提供一些但不是所有参数而获得的函数是有用的; 例如,许多语言都具有类似于plus_one的函数或运算符.Currying可以轻松定义这些功能.
小智 12
如果你的问题是如何在C#中实现currying,这是一个例子
public Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> func)
{
return p1 => p2 => func(p1, p2);
}
Run Code Online (Sandbox Code Playgroud)
Currying可以用支持闭包(lambdas)的任何语言实现,并且对于部分函数应用程序很有用,例如在UI编程中,其中没有接收到执行函数所需的所有输入,因此传递已经接收的输入的curry函数在里面.
C# 中柯里化的优点是它允许 C# 开发人员以函数式编程风格进行开发。
想想 LINQ。LINQ 查询允许您将方法作为参数传递:
someCollection.Where(x => x.someVal == 1);
Run Code Online (Sandbox Code Playgroud)
x.someVal == 1作为函数进行计算,然后Where在其自身的执行中使用返回值。
这是大多数 .NET 3 开发人员都熟悉的示例,但很少有人意识到他们正在涉足函数编程。如果没有 Curry 能力,LINQ 就不可能实现。
...希望这能弥补我自作聪明的评论。
| 归档时间: |
|
| 查看次数: |
3768 次 |
| 最近记录: |