什么是currying的真实用例?

Rom*_*kov 13 functional-programming currying

我一直在阅读很多关于currying的文章,但几乎所有这些都是误导性的,将currying解释为部分函数应用程序,并且所有示例通常都是关于arity为2的add函数,如函数或其他东西.

curryJavaScript中的许多函数实现使得每个部分应用程序接受多于1个参数(参见lodash),当维基百科文章明确指出currying是关于:

将带有多个参数(或参数元组)的函数的求值转换为评估函数序列,每个函数都有一个参数(部分应用程序)

所以基本上currying是一系列部分应用程序,每个应用程序都有一个参数.而且我真的想知道任何语言的真实用途.

scr*_*wtp 8

currying的实际用例是部分应用.

单独卷曲并不是非常有趣.有趣的是,如果您的编程语言默认支持currying,就像在F#或Haskell中一样.

您可以使用任何支持一等函数的语言为currying和partial应用程序定义更高阶函数,但这与您获得的每个函数都具有的灵活性相差甚远,因此无需您执行任何操作即可部分应用.

因此,如果你看到人们将currying和部分应用混为一谈,那是因为这些概念在那里紧密相关 - 因为currying无处不在,你并不需要其他形式的部分应用,而不是将curried函数应用于连续的参数.

  • 作为一个处于OP职位并且最近看到currying的吸引力的人,我不能同意这个答案.阅读https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch4.html和http://ramdajs.com/0.17/docs/#curry后,事情才有意义!这一切都是关于默认情况下将每个函数都设置为curry,这为在代码中使用部分应用的函数作为"构建块"打开了大门. (4认同)

Pie*_*ter 5

传递上下文很有用.

考虑'map'功能.它需要一个函数作为参数:

map : (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

给定一个使用某种形式的上下文的函数:

f    : SomeContext -> a -> b
Run Code Online (Sandbox Code Playgroud)

这意味着您可以优雅地使用map函数,而无需声明'a'参数:

map (f actualContext) [1,2,3]
Run Code Online (Sandbox Code Playgroud)

没有currying,你将不得不使用lambda:

map (\a -> f actualContext a) [1,2,3]
Run Code Online (Sandbox Code Playgroud)

笔记:

map是一个函数,它获取包含a函数值的列表f.它构建一个新的列表,通过获取每个列表a并应用f它,得到一个列表b

例如 map (+1) [1,2,3] = [2,3,4]