Currying在C#中的优势是什么?(实现部分功能)

mas*_*ani 16 c# currying

Currying在C#中的优势是什么?

在curry函数上实现部分函数应用的优势是什么?

Dav*_*vid 13

来自维基百科

当我们在一张纸上计算某些给定值的函数时,Currying实际上与我们所做的并没有太大的不同.

采取这个功能 f(x,y) = y / x

要评估f(2,3),首先,替换x2.

由于结果是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可以轻松定义这些功能.

  • 我在想他是否在问这个问题,WP的这句话对他没什么帮助. (6认同)

小智 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#pre lambda或c ++可以用来预先做更多的工作 (3认同)

Jus*_*ner 0

C# 中柯里化的优点是它允许 C# 开发人员以函数式编程风格进行开发。

想想 LINQ。LINQ 查询允许您将方法作为参数传递:

someCollection.Where(x => x.someVal == 1);
Run Code Online (Sandbox Code Playgroud)

x.someVal == 1作为函数进行计算,然后Where在其自身的执行中使用返回值。

这是大多数 .NET 3 开发人员都熟悉的示例,但很少有人意识到他们正在涉足函数编程。如果没有 Curry 能力,LINQ 就不可能实现。

...希望这能弥补我自作聪明的评论。

  • 我不明白你在哪里使用柯里化。 (20认同)
  • “柯里化有效地将函数分解为采用单个参数的函数”来源:http://msmvps.com/blogs/jon_skeet/archive/2012/01/30/currying-vs-partial-function-application.aspx Linq 是一个例子简单地传递函数,有时带有多个参数。 (3认同)
  • 只是补充一下上面的评论:您所描述的不是柯里化。请更新您的回复以避免误导其他人(特别是因为这是公认的答案)。 (2认同)