2015-09-20 63 views
1

我有以下與參數列表功能:鑽營如何工作

def foo(a:Int, b:Int)(x:Int)(y:Int) = a * b + x - y 

當我把命令的RELP

foo _ 

它顯示我

res5: (Int, Int) => Int => (Int => Int) = <function2> 

第一部分預計兩個int參數,然後我不知道如何繼續閱讀。
我可以使用函數像

foo(5,5)(10)(10) 

,但我不知道如何讀呢!

回答

2

一般情況下,A => B是一個匿名函數,鑑於 A型的參數時,返回類型爲B. 的價值現在的類型,類型 (Int, Int) => Int => (Int => Int) 可能看起來不那麼混亂,當你添加一些括號:

(Int, Int) => (Int => (Int => Int))

作爲一個開始,只是把它分解到

(Int, Int) => (… => …)

即給定兩個Int的函數返回另一個函數。返回的 函數具有類型

(Int => (Int => Int))

即函數,給定一個Int,返回,給出一個Int, 返回int另一功能。

1

這很容易。 (Int,Int)=> Int =>(Int => Int)意味着2個第一步返回一個函數,它將接受一些參數。例如:

(Int, Int) => Function that return 
    (Int) => Function that return 
    (Int) => Int 

爲什麼它有用?因爲當你有一個函數將函數作爲參數列入參數列表中時,你可以省略括號並使用大括號。

def someFunStuff(fun: Int)(stuff: Int => Int) = { 
    fun*stuff(fun) 
} 

someFunStuff(2) { x => 
    //Do some fun stuff 
    x * 2/x 
} 

如果您想了解更多,請閱讀Scala第二版中的第9.4章編程。