我正在读某个地方的咖喱功能,听起来很混乱。这个例子让我更加困惑。假设我有一个功能:
power :: (Int, Float) -> Float -- computes the nth power of b
power (n, b) =
if n == 0 then 1.0 else b * power (n-1, b)
现在我定义另一个函数powerc:: Int -> Float -> Float
,以便
powerc n b =
if n == 0 then 1.0 else b * powerc (n-1) b
有人可以向我解释powerc
如何power
函数的curry版本。
答案 0 :(得分:5)
因为powerc
现在允许部分申请:
square = powerc 2
顺便说一句,
powerc = curry power
答案 1 :(得分:5)
前者是一个带有Int, Float
元组的函数,而后者本质上是一个函数链,每个函数都接受一个单个参数并返回一个接下来的函数。
也就是说,powerc
需要Int
并返回函数,其中Float
并返回Float
。
您可以在部分应用中使用此功能。例如square = powerc 2
或cube = powerc 3
,其中每个都是简单的Float -> Float
函数,其中n
的值已被捕获。
非咖喱功能无法提供这种简单的部分应用。当前导参数是函数行为的一次性配置时,使用部分应用程序是很好的。在尝试重塑要传递给高阶函数的函数时,它也变得特别有用。例如,您可以在列表上映射powerc 2
(不定义)以将它们全部对齐。
希望有所帮助!