标签:
(1) 基本定义
scala> def max(x: Int, y: Int): Int = { if (x > y) x else y }
跟着是括号里带有冒号分隔的参数列表。 每个函数参数后面必须带前缀冒号的类型标注,因为Scala编译器(还有解释器,但之后我 们将只说编译器)没办法推断函数参数类型。
在max参数列表的括号之后你会看到另一个“: Int”类型标注。这个东 西定义了max函数的结果类型:result type。6跟在函数结果类型之后的是一个等号和一对 包含了函数体的大括号。 如果大括号内只有一段语句,则可以省略
scala> def max2(x: Int, y: Int) = if (x > y) x else y
(2)简写函数
(3) call by name
object Test { def main(args: Array[String]) { delayed(time()); } def time() = { println("Getting time in nano seconds") System.nanoTime } def delayed( t: => Long ) = { println("In delayed method") println("Param: " + t) t } }
(4)偏应用函数
对于List遍历,新的做法为
someNumbers.foreach(x => println(x))
这个例子中的下划线不是单个参数的占位符。它是整个参数列表的占位符。请记住要在函数名和下划线之间留一个空格,因为不这样做编译器会认为你是在说明一个不同的符号,比方说是,似乎不存在的名为println_的方法。
以这种方式使用下划线时,你就正在写一个偏应用函数:partially applied function。Scala里,当你调用函数,传入任何需要的参数,你就是在把函数应用到参数上。如,给定下列函数:
scala> def sum(a: Int, b: Int, c: Int) = a + b + c sum: (Int,Int,Int)Int
你就可以把函数sum应用到参数1,2和3上,如下:
scala> sum(1, 2, 3) res12: Int = 6
偏应用函数是一种表达式,你不需要提供函数需要的所有参数。代之以仅提供部分,或不提供所需参数。比如,要创建不提供任何三个所需参数的调用sum的偏应用表达式,只要在“sum”之后放一个下划线即可。然后可以把得到的函数存入变量。举例如下:
scala> val a = sum _ a: (Int, Int, Int) => Int = < function>
有了这个代码,Scala编译器以偏应用函数表达式,sum _,实例化一个带三个缺失整数参数的函数值,并把这个新的函数值的索引赋给变量a。当你把这个新函数值应用于三个参数之上时,它就转回头调用sum,并传入这三个参数:
scala> a(1, 2, 3) res13: Int = 6
实际发生的事情是这样的:名为a的变量指向一个函数值对象。这个函数值是由Scala编译器依照偏应用函数表达式sum _,自动产生的类的一个实例。编译器产生的类有一个apply方法带三个参数。产生的类扩展了特质Function3,定义了三个参数的apply方法。之所以带三个参数是因为sum _表达式缺少的参数数量为三。Scala编译器把表达式a(1,2,3)翻译成对函数值的apply方法的调用,传入三个参数1,2,3。因此a(1,2,3)是下列代码的短格式:
scala> a.apply(1, 2, 3) res14: Int = 6
Scala编译器根据表达式sum _自动产生的类里的apply方法,简单地把这三个缺失的参数前转到sum,并返回结果。本例中apply调用了sum(1,2,3),并返回sum返回的,6。
(5)高阶函数
见http://www.ibm.com/search/csass/search/?q=scala+%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh
http://www.ibm.com/developerworks/cn/java/j-lo-funinscala3/
http://nerd-is.in/2013-09/scala-learning-higher-order-functions/
http://zhangjunhd.github.io/2013/12/27/scala-note12-high-order-function.html
标签:
原文地址:http://www.cnblogs.com/yxzfscg/p/4907964.html