對於此功能:函數參數是如何定義的?
plus1 = (+) 1
我可以使用:
Prelude> plus1 3
4
類型PLUS1是
plus1 :: Integer -> Integer
如何函數參數整數被允許在這裏?在我的函數定義中,Integer函數參數定義在哪裏?
我不確定我期望會發生什麼,但是來自Java的所有參數都需要定義爲方法的一部分,但這裏似乎有幕後的事情發生了嗎?
對於此功能:函數參數是如何定義的?
plus1 = (+) 1
我可以使用:
Prelude> plus1 3
4
類型PLUS1是
plus1 :: Integer -> Integer
如何函數參數整數被允許在這裏?在我的函數定義中,Integer函數參數定義在哪裏?
我不確定我期望會發生什麼,但是來自Java的所有參數都需要定義爲方法的一部分,但這裏似乎有幕後的事情發生了嗎?
(如果我們忽略Num
類型類了一下,假裝+適用於Integer
唯一爲簡單起見,)(+)
是Integer -> (Integer -> Integer)
類型的函數(括號是沒有必要的,因爲->
是右關聯,但爲了清楚起見,我添加了它們)。這意味着它需要Integer
類型的參數,併產生一個類型爲Integer -> Integer
的函數作爲結果。
因此,當您將(+)
應用於整數1
時,您確實會得到該類型的函數作爲結果。由於add1
擁有該結果,因此它是Integer -> Integer
類型的函數,這就是爲什麼您可以將其應用爲plus1 3
。
+1,很難理解currying,但如果你知道Java/Javascript,你需要將'add'看作'function add(o1){return function(o2){return o1 + o2; }}',並將其稱爲'add(1)(2)'。那麼應該清楚'add(1)'實際上是什麼。 –
您使用短語「功能參數」至少對我來說有點混亂。你能更明確地陳述你認爲會發生什麼事情嗎? – Chuck
@Chuck請參閱更新 –
這個例子實際上用於解釋curried函數,參見:http://www.haskell.org/tutorial/functions.html。 –