码迷,mamicode.com
首页 > 其他好文 > 详细

scala学习笔记(7):函数

时间:2015-10-24 23:20:24      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

 

(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

scala学习笔记(7):函数

标签:

原文地址:http://www.cnblogs.com/yxzfscg/p/4907964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!