我经常在互联网上看到各种各样的抱怨,其他人的currying例子并不是currying,但实际上只是部分应用.
我没有找到关于部分应用是什么的合理解释,或者它与currying有何不同.似乎存在普遍的混淆,在某些地方将等效的例子描述为currying,在其他地方描述为部分应用.
有人可以向我提供这两个术语的定义,以及它们如何区别的细节吗?
language-agnostic terminology definition currying partial-application
部分应用很酷.什么功能functools.partial提供你无法通过lambdas?
>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
return x + y
>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5
Run Code Online (Sandbox Code Playgroud)
在functools某种程度上更有效,或可读?
我不认为我已经讨好了.我理解它的作用,以及如何做到这一点.我想不出我会用它的情况.
你在JavaScript中使用currying(或者使用它的主要库在哪里)?欢迎DOM操作或一般应用程序开发示例.
其中一个答案提到了动画.函数如slideUp,fadeIn将元素作为参数,通常是一个curried函数,返回高阶函数,内置默认的"动画函数".为什么这比仅使用某些默认值更高的函数更好?
使用它有什么缺点吗?
根据要求,这里有一些关于JavaScript currying的好资源:
我会在评论中添加更多内容.
因此,根据答案,currying和部分应用一般是便利技术.
如果您经常通过使用相同配置调用高级函数来"精炼"高级函数,则可以使用更高级别的函数来设置(或使用Resig的部分)来创建简单,简洁的帮助器方法.
我无法理解functools中的部分工作原理.我从这里得到以下代码:
>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
return x + y
>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5
Run Code Online (Sandbox Code Playgroud)
现在就行了
incr = lambda y : sum(1, y)
Run Code Online (Sandbox Code Playgroud)
我得到的是,无论我传递给incr它的任何论点都将被传递y给lambda哪个将返回sum(1, y)ie 1 + y.
我明白那个.但我不明白这一点incr2(4).
如何在部分函数中4传递x?对我来说,4应该更换sum2.x和之间有什么关系 …
我有两次最近重构的代码,以便更改参数的顺序,因为有太多的代码,黑客喜欢flip或\x -> foo bar x 42正在发生.
在设计功能签名时,哪些原则可以帮助我充分利用currying?
我想知道是否有任何方法可以在Java中提取它.我认为没有原生支持闭包是不可能的.
多个参数列表,例如def foo(a:Int)(b:Int) = {}每个列表的多个参数,例如def foo(a:Int, b:Int) = {},就我所知,在语义上是等效的,并且大多数函数语言只有一种方式来声明多个参数,例如F#.
我可以找到支持这两种函数定义样式的唯一原因是允许使用只有一个参数的参数列表进行类似语法的语言扩展.
def withBufferedWriter(file: File)(block: BufferedWriter => Unit)
Run Code Online (Sandbox Code Playgroud)
现在可以使用syntax-looking调用
withBufferedWriter(new File("myfile.txt")) { out =>
out write "whatever"
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果没有多个参数列表,可能还有其他方法可以支持花括号的使用.
一个相关的问题:为什么在Scala中使用多个参数列表称为"currying"?Currying通常被定义为为了支持部分应用而使n-ary函数一元化的技术.但是,在Scala中,可以部分应用函数,而不会使函数的"curried"(多个参数列表,每个参数列表).
在Scala中,可以像这样编写(curried?)函数
def curriedFunc(arg1: Int) (arg2: String) = { ... }
Run Code Online (Sandbox Code Playgroud)
上述curriedFunc函数定义与两个参数列表和单个参数列表中具有多个参数的函数之间有何区别:
def curriedFunc(arg1: Int, arg2: String) = { ... }
Run Code Online (Sandbox Code Playgroud)
从数学的角度来看,这是(curriedFunc(x))(y),curriedFunc(x,y)但我可以写def sum(x) (y) = x + y,同样的def sum2(x, y) = x + y
我只知道一个区别 - 这是部分应用的功能.但这两种方式对我来说都是等同的.
还有其他差异吗?
如何将参数绑定到Python方法以存储一个用于以后调用的nullary仿函数?与C++类似boost::bind.
例如:
def add(x, y):
return x + y
add_5 = magic_function(add, 5)
assert add_5(3) == 8
Run Code Online (Sandbox Code Playgroud) According to my understanding, partial functions are functions that we get by passing fewer parameters to a function than expected. For example, if this were directly valid in Python:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
Run Code Online (Sandbox Code Playgroud)
In the snippet above, new_function is a partial function. However, according to the Haskell Wiki, the definition of partial function is
A partial function is a function that is not defined for all possible arguments of …
python haskell functional-programming partial-application partial-functions
currying ×6
python ×4
haskell ×2
scala ×2
definition ×1
function ×1
functools ×1
java ×1
javascript ×1
terminology ×1