请您向我解释一下柯里化在涉及高阶函数时是如何工作的,尤其是下面的示例
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
值。
有人可以帮我解决以下问题吗,
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 argument3
.
因此,从其他更传统的语言的角度来看,我们将此称为柯里化和部分应用程序之间的区别。
但是从 Haskell 的角度来看,它确实是关于柯里化的,即一次将一个函数应用于其参数,直到完全饱和,如其类型所示(即 a->a->a
值应用于 a
值会变成 a->a
值,然后在依次应用于 a
值时会变成 a
值。