|
|
1
745
curring是将一个接受多个参数的函数分解为一系列接受部分参数的函数。以下是javascript中的一个示例:
这个函数接受两个参数a和b,并返回它们的和。我们现在将使用curry函数:
这个函数接受一个参数a,并返回一个接受另一个参数b的函数,这个函数返回它们的和。
第一条语句返回7,就像add(3,4)语句一样。第二条语句定义了一个名为add3的新函数,该函数将在其参数中添加3。这就是一些人所说的结束。第三条语句使用add3操作将3添加到4,结果再次生成7。 |
|
|
2
117
在函数代数中,处理带多个参数的函数(或者等价的一个参数是一个n元组)有点不雅观——但是,正如Moses Sch_《Nfinkel》(以及独立的Haskell Curry)所证明的那样,不需要:只需要带一个参数的函数。
那么你如何处理你自然会表达的东西,比如说,
像往常一样, wikipedia 有一个很好的关于这个的摘要条目,有很多有用的指针(可能包括你最喜欢的语言的指针;-)以及稍微更严格的数学处理。 |
|
|
3
90
下面是一个具体的例子: 假设你有一个计算作用在物体上的引力的函数。如果你不知道公式,你可以找到它。 here . 此函数接受三个必需的参数作为参数。 现在,在地球上,你只想计算这个星球上物体的力。在函数语言中,你可以把地球的质量传递给函数,然后对其进行部分求值。你得到的是另一个函数,它只需要两个参数,就能计算出地球上物体的引力。这叫咖喱。 |
|
|
4
45
Currin是一种可以应用于函数的变换,允许它们采取比以前更少的参数。 例如,在f*中,你可以这样定义一个函数:
在这里,函数f取参数x,y和z,并将它们相加,这样:
返回6。 根据我们的定义,我们可以定义Fr:Cury函数:
其中“fun x->f x”是一个lambda函数,等价于c中的x=>f(x)。这个函数输入你想要的函数并返回一个 只接受一个参数 并返回指定的函数,其中第一个参数设置为输入参数。 用我们前面的例子,我们可以得到F的咖喱:
然后我们可以执行以下操作:—
这为我们提供了函数f1,它等价于f1 y z=1+y+z。这意味着我们可以做如下:
返回6。 这个过程常常与“部分函数应用”混淆,可以定义如下:
虽然我们可以将它扩展到一个以上的参数,即:
部分应用程序将获取函数和参数,并返回一个需要一个或多个较少参数的函数,如前两个示例所示,该函数直接在标准f函数定义中实现,因此我们可以实现前面的结果,从而:
结果是6。 总之: curring和partial function应用的区别在于: curring接受一个函数并提供一个接受单个参数的新函数,然后返回指定的函数,并将其第一个参数设置为该参数。 这允许我们将多个参数的函数表示为一系列单参数函数 . 例子:
部分函数应用程序更直接-它接受一个函数和一个或多个参数,并返回一个函数,其中前n个参数设置为指定的n个参数。例子:
|
|
|
5
31
它可以是一种使用函数来生成其他函数的方法。 在javascript中:
我们可以这样称呼它:
当这个运行时
这意味着我们返回这个函数:
所以当你打电话
你真的在打电话:
如果你这样做:
这和:
所以我们的
|
|
|
6
28
curried函数是由多个重写的参数组成的函数,它接受第一个参数并返回一个接受第二个参数的函数,依此类推。这允许多个参数的函数部分应用它们的一些初始参数。 |
|
|
7
6
下面是python中的一个玩具示例:
(只需使用via+连接来避免分散非python程序员的注意力。) 编辑以添加: 见 http://docs.python.org/library/functools.html?highlight=partial#functools.partial , 这也显示了python实现这一点的方式中部分对象与函数的区别。 |
|
|
8
4
如果你明白
克洛伊尔
你可能知道
让我们自己用
在这里,我们返回另一个函数,该函数在
现在想象一下,如果语言足够聪明,能够内省地理解
这是一些语言的行为方式。当人们希望将函数组合成更大的转换时,它非常有用。这将导致一个传感器。 |
|
9
3
我发现这篇文章及其引用的文章对更好地理解curring很有用: http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx 正如其他人提到的,这只是一种拥有单参数函数的方法。 这很有用,因为您不必假定将传入多少参数,因此不需要2参数、3参数和4参数函数。 |
|
|
10
3
咖喱可以简化你的代码。这是使用它的主要原因之一。curring是将接受n个参数的函数转换为只接受一个参数的n个函数的过程。 原则是使用closure(closure)属性传递传递函数的参数,将它们存储在另一个函数中并将其作为返回值处理,这些函数形成一个链,传递最终参数以完成操作。 这样做的好处是可以通过一次处理一个参数来简化参数的处理,也可以提高程序的灵活性和可读性。这也使程序更易于管理。同时,将代码分割成更小的片段将使其易于重用。 例如:
我也可以…
这对于使复杂代码整洁、处理非同步方法等非常有用。 |
|
11
2
curried函数应用于多个参数列表,而不是 一个。 这里有一个常规的、非curry函数,它添加了两个int 参数,x和y:
这里有一个类似的函数。相反 在一个包含两个int参数的列表中,将此函数应用于一个 每个int参数:
这里发生的是当您调用
下面是一个名为
将1应用于第一个函数——换句话说,调用第一个函数 传递1得到第二个函数:
对第二个函数应用2将得到结果:
|
|
|
12
2
curring的一个例子是,当使用函数时,您目前只知道其中一个参数: 例如:
这里,因为在将回调发送到时不知道回调的第二个参数
|
|
|
13
2
正如所有其他答案一样,curring有助于创建部分应用的函数。javascript不支持自动套现。因此,上面提供的示例在实际编码中可能没有帮助。livescript中有一些很好的例子(基本上编译成js) http://livescript.net/
在上面的例子中,当您给出的参数较少时,livescript会为您生成新的curried函数(double) |
|
|
14
0
在这里,您可以找到用c_实现的简单解释。在评论中,我试图展示咖喱是多么有用:
|
|
|
15
0
curring是将一个函数从callable转换为
否则,curring就是将一个接受多个参数的函数分解为一系列接受部分参数的函数。 字面上讲,curring是一种函数转换:从一种调用方式转换到另一种调用方式。在javascript中,我们通常制作一个包装器来保存原始函数。 curring不调用函数。它只是改变了它。
使curry函数为两个参数函数执行curry。换句话说,
正如您所看到的,实现是一系列包装。
|
|
|
CL. · 如何将Curry()与Vectorize()结合? 8 年前 |
|
|
JuanPablo · javascript,向原型添加函数 8 年前 |
|
|
Spark Monkay · Curry匿名函数 9 年前 |
|
|
sharath chandra · Scala函数文本类型问题 9 年前 |
|
|
pathikrit · Scala部分函数应用语义+同步锁定 9 年前 |
|
|
Charles Pehlivanian · R库里古怪 10 年前 |