2016-05-05 30 views
2

我試圖找出背後「柯里化」的因果邏輯,並得出以下結果:爲什麼哈斯克爾有一個參數

  1. 多個參數函數可以表達爲元組(結合多個參數以不同類型作爲一個參數)和列表(將多個參數與同一類型組合爲一個參數)。所以所有函數都可以表示爲單參數函數。
  2. 所以在Haskell中,函數只需要一個參數。我們如何實現多參數函數。
  3. 使用柯里。柯里化是實現多個參數功能的一種方式。

我認爲上述邏輯1 - > 2 - > 3是混淆回答「爲什麼使用咖喱」。對於語句3,還可以將多個元組或列表組合爲單個參數來實現多個參數函數。

看起來聲明1不是聲明2的正確理由。我敢肯定的是2-> 3是正確的推理,但背後的原因是什麼?爲什麼Haskell作爲一種函數式語言,只有一個參數?

大多數書籍將語句2視爲公認的事實。有人知道2背後的原因嗎?還是有人知道「爲什麼要加油」的正確邏輯?

+0

你問:「爲什麼要使用咖喱?」,這意味着在某些時候有人認爲:「讓我們用柯里化來解決我們有的語言設計問題。」但事實並非如此。有人認爲,「讓我們製作一種簡單,優雅,表達,方便,安全和靈活的語言。」解決這些問題的方法是使用具有歸納類型的lambda微積分,一個很好的類型系統以及一種不尋常的減少策略。 「使用柯里化」不是解決這些問題的方法之一,而是解決這些問題的巧妙便捷的工具。 –

+0

如果你想到產品類型的元組(例如:「Bool」有兩個居民,「Maybe Bool」有三個居民,(Bool,Maybe Bool)有六個居民),那麼函數類型就是指數。由於'e ^(x * y)=(e^x)^ y',您總是可以用類型'(x,y) - > e'將類型爲'y - >(x - > e)'。這簡直就是咖啡。因爲您總是可以重寫這些函數(在這種情況下,成本相對較低),所以您不需要*將多參數函數作爲一個基本概念,否則會使語言定義複雜化。 –

回答

1

首先,您需要記住Haskell完全基於Lambda微積分。它是建立在科學編程模型上的(儘管它並不意味着該語言只有科學的用途)。

我認爲你錯了,是因爲它可以顯示爲元組或列表,即使這將是一個非常聰明的解釋,它不會只獲得一個參數。

Haskell中只需要因爲柯里的一個參數:

F(X,Y)= F(X)(Y)

其中f(x)返回一個函數,它有一個參數。 Currying是這整個「函數返回函數」方案。所以,當你f(x)(y)你實際上將'y'傳遞給'f(x)'函數。

經典的例子:

add :: a->(a->a) 
add(x) = x'+' 

隨着 '+' 是一個函數,這意味着它需要另一種說法,我們可以:

add(3)(5) == 8 

我們不是通過這兩個參數添加 ,只有一個,所以它可以生成'+',從而得到另一個參數。

當你認爲,會有很大的意義,我們可以繼續爲什麼。嗯,主要是合成糖,但是一個非常強大的糖。例如,我們可以定義基於其他功能,而無需指定參數:

add = '+' 

突然我分配值的功能不提的參數(假設當然他們的類型聲明匹配)。這有很多其他的可能性,並且可以簡化抽象。

這裏有好的答案具有良好的例子:https://softwareengineering.stackexchange.com/questions/185585/what-is-the-advantage-of-currying

+0

感謝您的提醒,Haskell基於lamda微積分。我已經通過lambda微積分並找到了我認爲非常接近的答案:首先,使用其定義的lamda微積分被證明是通用的,因爲所有計算都可以從物理學的角度來看它。其次,lambda定義之一是每個函數只有一個參數。然後,如果lambda演算不能呈現多個參數函數,它可以如何聲明爲通用的。答案當然是可以的,只能通過使用Curryring(高階函數)。 – Johnson

+0

是的,你很好。 – eduardogbg

2

功能

f x y = x + y 

具有類型(假設x & yInteger S)

f :: Integer -> Integer -> Integer 

這是相同的

g :: Integer -> (Integer -> Integer) 

這意味着f是一個函數那需要Integer並返回一個新功能,該功能也需要Integer並返回Integer。 Currying是一個過程,一個接受多個參數的函數實際上被評估爲一系列帶有一個參數的函數。

柯里使得如下

plusTwo :: Integer -> Integer 
plusTwo = f 2 

上面的代碼簡單地適用於2f結合名稱plusTwo到所得到的函數很容易部分地應用的功能。

這使得開發人員將常見行爲抽象到一個地方變得非常容易。

4

使用鑽營作爲多參數的函數的優選方法的決定是基於以下兩個原因。首先,Haskell牢牢紮根於使用柯里化的lambda演算。其次,咖喱容易部分應用,這是一個無法形容的語言方面。