一门运行于JVM并将面向对象和函数编程完美结合的语言。
在Scala中main函数需要存在于object对象中
函数体最后一行的值就是整个函数的返回值。当函数不带参数时候可以省略括号 调用函数可以直接使用函数名即可
双箭头=>的使用 参考:http://blog.sina.com.cn/s/blog_764943770102whmx.html
第一种 函数类型:
定义函数时,参数则如下:
def functionName(fun: Type => Type) = {}
上述表达式中 使用=>来说明函数类型。
第二种 匿名函数:
当需要一个匿名函数时,如下:
val valueName = (x: Int) => x * x
上述表达式中 使用=>来说明匿名函数的返回。
Scala中有两种求值策略,即call by value 和 call by name,其中call by name 就要用到=>,下面简单介绍下两种求值策略。
1.Call by value
按值传递,即在传入参数时,先计算实参的值,切只求一次,再进行调用,例如:
def fun1(x: Int, y: Int) = x * y
其中 当我们传入表达式参数时,会先对实参进行计算,再进行函数调用。比如我们使用:
fun1(3+4,3)
这样的表达式时,会直接先计算3+4的值,使得函数变为7*3,最后得出函数值,相当于fun1(7,3)。
2.Call by name
按名调用, 函数实参每次在函数中被用到时,都会求值。例如:
def fun2(x: => Int, y: Int) = x * y
其中的=>符号就表示 x参数要Call by name ,所以 当我们同样使用:
fun(3+4,3)
时,并不会使之成为fun(7,3),而只是在用到x这个参数时,才会被求值,变为(3+4)*3,然后是7*3,最后得出结果,并且每次用到x都会求值一次。
模式匹配:
val str :String = "abc"
val s = str match {
case "abc" => "right"
case "def" => "wrong"
case _ => "Unknow"
}
scala 中模式匹配中的 => 表示表达式返回所匹配的值,和java 中的switch case有些类似,但每一个case不会传入下一个case, 所以不需要break来跳出,“_”表示通配所有其余可能。
Scala柯里化;有多个参数列表 的函数就是柯里化函数 参考:http://bit1129.iteye.com/blog/2217658
curry化最大的意义在于把多个参数的function等价转化成多个单参数function的级联,这样所有的函数就都统一了,方便做lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化以后,放在两个参数列表里,后面一个参数列表里的参数可以借助前面一个参数列表里的参数类型进行推演。这就是为什么 foldLeft这种函数的定义都是curry的形式