通过例子理解currying

时间:2012-10-24 14:16:15

标签: haskell functional-programming

我正在读某个地方的咖喱功能,听起来很混乱。这个例子让我更加困惑。假设我有一个功能:

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版本。

2 个答案:

答案 0 :(得分:5)

因为powerc现在允许部分申请:

square = powerc 2

顺便说一句,

powerc = curry power

答案 1 :(得分:5)

前者是一个带有Int, Float元组的函数,而后者本质上是一个函数链,每个函数都接受一个单个参数并返回一个接下来的函数。

也就是说,powerc需要Int并返回函数,其中Float并返回Float

您可以在部分应用中使用此功能。例如square = powerc 2cube = powerc 3,其中每个都是简单的Float -> Float函数,其中n的值已被捕获。

非咖喱功能无法提供这种简单的部分应用。当前导参数是函数行为的一次性配置时,使用部分应用程序是很好的。在尝试重塑要传递给高阶函数的函数时,它也变得特别有用。例如,您可以在列表上映射powerc 2(不定义)以将它们全部对齐。

希望有所帮助!