2012-10-24 70 views
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 

可有人请给我怎么powercpower功能的咖喱版的解释。

回答

4

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

square = powerc 2 

顺便说一句,

powerc = curry power 
+0

如何直接写square = powerc 2 – OneMoreError

+0

在这种情况下b和n的值是多少? – OneMoreError

+3

'square = powerc 2'定义了一个新的函数'square :: Float - > Float'。直观地说,它是'powerc'的一个版本,其中'n'总是2.'b'将是你传递给它的任何东西;即“方形4 == 16.0”。 – jtobin

5

前者是一个函数获取Int, Float元组,而后者基本上是每次取一个功能的链单个参数并返回一个接下一个函数。

即,powerc需要一个Int并返回一个函数采用一个Float并返回一个Float

你可以利用这部分应用程序。例如square = powerc 2cube = powerc 3,它们各自都是简单的Float -> Float函数,其中捕获的值为n

非咖喱功能不支持这种简单的部分应用。当引用参数是函数行为的一次性配置时,使用部分应用程序是很好的。当尝试重新设计传递给高阶函数的函数时,它也变得特别有用。例如,您可以将powerc 2(未定义)映射到列表上以将它们全部排列。

希望有帮助!