我正在学习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个参数)?
答案 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 * z
,g(y, z) = f(2, y, z) = 2 * y * z
和h(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,因为它是惰性求值的。也就是说,它必须先计算一个值。