0

我在某个地方读到了咖喱函数,这听起来很混乱。这个例子让我更加困惑。可以说我有一个功能:

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

4

2 回答 2

5

因为powerc现在允许部分应用:

square = powerc 2

顺便提一句,

powerc = curry power
于 2012-10-24T14:24:54.663 回答
5

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

也就是说,powerc接受a 并返回一个接受 a并返回Inta 的函数FloatFloat

您可以通过部分应用程序来使用它。例如square = powerc 2,或者cube = powerc 3每个都是具有捕获Float -> Float值的简单函数。n

非柯里化函数不能提供这种简单的部分应用程序。当主要参数是函数行为的一种一次性配置时,最好使用部分应用程序。当试图重塑函数以传递给高阶函数时,它也变得特别有用。例如,您可以映射powerc 2(不定义)列表以将它们全部平方。

希望有帮助!

于 2012-10-24T14:45:59.983 回答