2012-10-24 68 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(未定義)映射到列表上以將它們全部排列。

希望有幫助!