我试图理解柯里化的概念并去了 Haskell documentation 。然而,它说



然而 f 有两个参数,而 g 只有一个。由于柯里化正在将一个接受多个参数的函数转换为一个接受一个参数并返回另一个函数的函数,“g”不应该是柯里化函数吗?

来自haskell文档


f :: a -> b -> c
is the curried form of
g :: (a, b) -> c

所以这对我来说似乎是矛盾的,而且我也看不到这两个函数中的任何一个都返回一个函数。

最佳答案



不,实际上两个函数都采用一个参数。事实上,在 Haskell 中,所有函数都只接受一个参数。

如果你写下这样的签名:

f :: a ->  b -> c

那么这是一个不那么冗长的形式:
f :: a -> (b -> c)

这是如何运作的? f 是一个函数,它接受一个参数,然后返回另一个再次接受一个参数的函数。

以函数 add :: Int -> Int -> Int 为例。

如果我们写 add 5 2 ,我们就这样计算 5 + 2 。看起来它需要两个参数,但实际上我们已经编写了 (add 5) 2 。因此,我们以 add 作为参数调用 5 函数。这将返回一个函数(让我们称这个函数为 add5 :: Int -> Int )。所以这个 add5 函数将 5 添加到一个数字。因此,如果我们然后调用 add5 2 ,那么我们获得 7 ,因为 add5 返回添加到参数中的 5

然而,我们可以构造一个函数(如 g ),它接受一个 2 元组参数,因此我们可以使用另一种类型将两个值作为一个参数传递。实际上,您可以看到g(5, 2)实际上是g (5, 2):您使用一个参数(一个2元组(5, 2))调用该函数。

因此,柯里化旨在将这种带有一个参数(一个 2 元组)的 g 函数转换为一个再次采用一个参数的 f 函数,然后这将构造一个函数,该函数将采用原始 2 元组的第二个元素。

10-06 11:26