2010-10-07 136 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]