curried函数如何在Haskell中工作?

时间:2016-12-15 04:13:54

标签: haskell

我正在学习Haskell。我知道Haskell中的任何函数都只能使用一个参数。所以,如果你看到一个函数max 2 4;它实际上是(max 2) 4。他们所说的是将2应用(作为参数)到max,它返回一个以4为参数的函数。我无法理解的是当2应用于max时会发生什么?它返回一个名为(max 2)的函数是什么意思?

让我再举一个例子,让我的问题更清楚。使用此功能:multiply x y x = x*y*z。他们说它实际上是用这种方式评估的:((multiply x) y) z。现在我给出这个输入:multiply 2*4*5 这是如何评估的?

multiply 2

返回(multiply 2),并将4应用为参数:

(multiply 2) 4

现在返回什么 - ((multiply 2) 4)multiply 8?如果它在此步骤中乘以4和2,那么Haskell如何知道它必须这样做(因为该函数只能乘以3个参数)?

1 个答案:

答案 0 :(得分:2)

以数学方式思考:假设有一个函数采用两个变量:f(x, y)。修复x=2会为您提供一个包含一个变量的新函数:g(y)=f(2, y)

如果f(x, y) = max(x, y)给出了x和y的最大值,g(y) = f(2, y) = max(2, y)给出的最大值为2和y。

适用于f(x, y, z) = x * y * zg(y, z) = f(2, y, z) = 2 * y * zh(z) = g(4, z) = f(2, 4, z) = 2 * 4 * z

此外,您可以修复x = 2和z = 4以形成p(y) = f(2, y, 4)。在Haskell中它是

\y -> multiply 2 y 4

对于实现,Haskell实际上不会乘以2和4,因为它是惰性求值的。也就是说,它必须先计算一个值。