2011-03-14 49 views
17

我看到很多關於柯里技術的文檔和問題,但是我發現很少有關於爲什麼會在實踐中使用它的信息。我的問題是,咖喱的優點是什麼?也許你可以提供一個簡單的例子,其中咖啡比傳統的方法調用更可取。柯里咖啡的實用優勢是什麼?

我在C++中工作,而太陽升起了,所以到目前爲止,我幾乎沒有接觸到柯里化以外的工作,而不是使用語言修補工作。

+1

這似乎相關:http://stackoverflow.com/questions/4888480/practical-use-of-curried-functions/4894045#4894045 - 它回答你的問題嗎? – 2011-03-14 16:22:33

+0

謝謝。 Jakob的文章在這種情況下給了我很多見解。鏈接的文章就是基於此。 – 2011-03-16 15:26:40

+1

在這個答案中有一個簡單的,非理論的例子:http://stackoverflow.com/questions/2725811/is-currying-just-a-way-to-avoid-inheritance/2725841#2725841 – jtolle 2011-03-20 21:37:35

回答

13

首先,錯誤地將部分功能應用程序誤認爲是很常見的事情。例如見this(我確定有更好的資源描述它,但這是我發現的第一個資源)。我幾乎從來沒有見過任何人在實踐中使用currying(除了像Haskell這樣的語言,每個函數都被語言自身粘貼,可以這麼說,但即使這樣做也是爲了實現簡單的部分函數應用)。另一方面,部分功能應用在許多語言中都非常有用。不管怎麼說,假設你正在討論部分函數應用(因爲這是大多數人在討論currying時所討論的內容),所以這個概念在C++中並不像純函數式語言那樣自然,比如Haskell。

例如,在這裏我們定義一個函數sum,它需要一組數字list並將所有數字相加在一起。如果您對摺疊概念(或縮小或注入,有時稱爲)不熟悉,請閱讀this。無論如何,它看起來像這樣:

sum list = foldl (+) 0 list 

但是等一下。我們可以通過使用部分函數應用程序來縮短它!我們只是說sum是一個等於foldl的函數,而部分應用了+和0,而不是提供參數。

sum = foldl (+) 0 

哪一個比較容易閱讀?可能是一個偏好問題,但後者在我看來更加清楚地強調了sum和foldl之間的關係。請考慮到這是一個非常簡單的例子。我真的不知道如何用C++編寫一個好例子,所以你不得不原諒我。無論如何,實用優勢是什麼?可讀性。更明確的意圖。較短的代碼。

免責聲明:如果您真的想知道柯里化的優點(與部分功能應用相對),我很抱歉讓您閱讀了所有這些內容。但另一方面,如果你明白兩者的區別,也會明白,咖喱是實現部分功能應用的好方法。

+3

我認爲你的通過在第一個例子中部分應用+來更清楚地說明點。也不需要currying能夠部分應用?所以currying,因爲將tupled參數轉換爲curried參數的過程(例如Haskell中的'curry'函數)非常有用。 – 2011-03-14 16:51:53

+0

「可讀性,更清晰的意圖,更短的代碼」 - 坦率地說,這是一個非常弱的論點,考慮了不可讀的功能代碼的普遍性。我想你只是說'因爲熟悉偏見'。 – JoyalToTheWorld 2017-08-04 18:32:22