2016-07-25 39 views
0

我讀這本書階和有點不確定什麼這個語法轉化爲int:不確定如何返回的功能

def bf: Int => Int => Int = i => v => i + v 
  1. BF是函數的名稱。
  2. 再經過結腸是作爲函數返回類型:

INT => INT =>內部

我假定等號是函數體的開始,但不知道因爲那時它的I => v =>我+ v

有人能明確每個返回類型,以及如何你打破它,在你的腦袋,所以我可以做同樣的:)

+0

'='是類型的結尾,以及值的開始。不一定是功能體。 – Bergi

回答

4

簡短的回答:

代碼的返回類型可以被讀爲Int => (Int => Int)。 它是一個函數,它接受Int的單個參數並返回一個接受另一個Int參數並返回Int的函數。

如果您仍然感到困惑,這是寫更長的方法。

val bf: Int => (Int => Int) = (a:Int) => ((b: Int) => a + b) 
     |_________________| |____________________________| 
       type     outer function 
              |________________| 
              inner func returned by the outer func 

龍答:

它通常被稱爲curried functionfunction currying

我假設你已經注意到了這個,但是,這個方法最初試圖得到2個Int值的總和,它寫成如下。

val foo = (a: Int,b: Int) => a + b 

這需要多個參數的任何功能可轉化爲單嵌套參數功能a.k.a「咖喱功能」。 您可以像您的問題代碼一樣自行編寫代碼,但您也可以撥打.curried以獲取方法/函數。

val bf = foo.curried //bf is exactly the same thing as you wrote

這通常是用來當你不能在同一時間同時定義參數的,所以當你得到第一個值,使該(b: Int) => YOUR_FIRST_VALUE_ALREADY_DEFINED + b功能。並在你獲得第二個價值時打電話給它。

如何使用咖喱功能...

bf(4)(5) //9 
val bar = bf(6) // (Int) => Int 
bar(7) // 13