请您向我解释一下柯里化在涉及高阶函数时是如何工作的,尤其是下面的示例

Please could you explain to me how currying works when it comes to higher order functions, particularly the example below

有人可以帮我解决以下问题吗,

applyTwice :: (a -> a) -> a -> a  
applyTwice f x = f (f x)

我不明白上面的工作原理。如果我们有类似 (+3) 10 的东西,它肯定会产生 13 吗?怎么样f (f x)。在查看高阶函数时,基本上我不理解柯里化。

所以我不明白的是,如果说我们有一个形式为 a -> a -> a 的函数,它将需要一个输入 a 然后生成一个函数,该函数期望另一个输入 a 产生一个输出.因此,如果我们有 add 5 3 那么执行 add 5 将产生一个函数,该函数期望输入 3 产生最终输出 8。我的问题是这在这里是如何工作的。我们将一个函数作为输入,所以这里的部分函数应用程序是否像在 add x y 中那样工作,或者我是否完全将所有内容复杂化了?

那不是柯里化,那是部分应用。

> :t (+)
(+) :: Num a => a -> a -> a

> :t (+) 3
(+) 3 :: Num a =>    a -> a

部分应用程序 (+) 3 确实产生了一个函数 (+3)(*) 等待另一个数字输入以产生其结果。它确实这样做了,无论是一次还是 两次.

你的例子扩展为

applyTwice (+3) 10 = (+3) ((+3) 10) 
                   = (+3) (10+3)
                   =      (10+3)+3

仅此而已。


(*)(其实是(3 +),不过反正和(+ 3)一样)。


As chepner clarifies in the (以最少的复制编辑引用),

partial application is an illusion created by the fact that functions only take one argument, and the combination of the right associativity of (->) and the left associativity of function application. (+) 3 isn't really a partial application. It's just [a regular] application of (+) to an argument 3.

因此,从其他更传统的语言的角度来看,我们将此称为柯里化和部分应用程序之间的区别。

但是从 Haskell 的角度来看,它确实是关于柯里化的,即一次将一个函数应用于其参数,直到完全饱和,如其类型所示(即 a->a->a 值应用于 a 值会变成 a->a 值,然后在依次应用于 a 值时会变成 a 值。