2010-10-07 137 views
11

右箭頭的含義在編程在Scala中的第9章,還有一個實例方法是這樣的:在斯卡拉

def twice(op: Double => Double, x: Double) = op(op(x)) 

作者在書中說:

在這種類型的運算的示例是 Double => Double,這意味着它是一個 函數,它將一個Double作爲參數 並返回另一個Double。

我不明白什麼是「雙=> Doulbe」在這裏,在前面的章節,其中「=>」僅根據出現因爲意味着功能的文字,以及從來沒有寫過這樣的「類型=>類型」,對於scala函數的字面語法定義,函數literal的右邊部分是函數體,函數體怎麼能是「double」?

回答

38

因爲它有兩個用途。

首先,您可以使用=>來定義函數文字。

scala> val fun = (x: Double) => x * 2 
fun: (Double) => Double = <function1> 

scala> fun (2.5) 
res0: Double = 5.0 

這很容易。但這裏的問題是,什麼類型的fun是?它是一個「以Double爲參數並返回雙精度的函數」,對嗎?

那麼我怎麼能註釋它的類型的樂趣?那是(Double) => (Double)。那麼,前面的例子可以改寫爲:

scala> val fun: Double => Double = (x: Double) => x * 2 
fun: (Double) => Double = <function1> 

scala> fun (2.5)          
res1: Double = 5.0 

好的,那麼下面的代碼是做什麼的?

def twice(op: Double => Double, x: Double) = op(op(x)) 

那麼,它會告訴你OP是(Double => Double),這意味着它需要一個函數,它接受一個雙並返回一個雙。

因此,您可以將之前的fun函數傳遞給它的第一個參數。

scala> def twice(op: Double => Double, x: Double) = op(op(x))  
twice: (op: (Double) => Double,x: Double)Double 

scala> twice (fun, 10) 
res2: Double = 40.0 

這將是等同於fun更換op,並與10替換x,即fun(fun(10)),其結果將是40

11

除了從功能體中文字的功能分離的參數列表中,雙箭頭可以用作語法糖爲一個功能N型:

T => R裝置Function1[T, R]

(T1, T2) => R裝置Function2[T1, T2, R]

...

在你的例子中,這意味着op是一個函數,它需要一個Doub並返回一個Double(如作者解釋)。

再舉一個例子,有可能寫

// declare len as a function that takes a String and returns an Int, 
// and define it as returning the length of its argument 
val len: String => Int = { _.length } 

// or, a more verbose version that uses '=>' in both ways 
val len: String => Int = { (s: String) => s.length } 

len("apple") // returns 5 
+0

爲什麼你列舉'Function'? (如'FunctionN','Function1'等) – corazza 2014-03-08 18:17:46

+0

@jcora - FunctionN是Scala中的一個特徵,Function1是表示具有1個參數的函數的特徵類型 - 檢出https://gleichmann.wordpress.com/2010/11/08/functional-scala-functions-as-objects-as-functions /和http://mikefroh.blogspot.co.uk/2011/12/intro-to-functional-programming-with.html – 2016-06-01 00:13:24

2

這是一個函數,採用雙並返回一個double。

scala> def d2d = (d:Double) => d 
d2d: (Double) => Double 

它的類型是Function1[Double,Double]