Scala 混合了面向对象以及函数式的特性。在函数式编程语言中,函数是头等公民,可以像其他任何数据一样被传递和操作。
//difine a val a = List(1,2,4) //map a.map((x:Int) => x*3)
由于map方法知道你会传入一个类型为 (Int) => Int 的方法,你可以简单的写成:
a.map(x => x*3) //如果参数在 =>右侧仅仅出现过一次,可以用_代替 a.map(_ => _*3) a.map(_ * ,http://gzfpdk.tumblr.com/;3)
错误例子:
def test[A](a: List[A], f: A => A) = a.map(f) println(test(List(1,http://shanghfpk.tumblr.com/,2,3), _*2)) error: missing parameter type for expanded function ((x$2) => x$2.$times(2))
为什么在这里第二个函数中A却无法参数识别呢?
根据scala的参数类型推断,流程是从左到右,从参数到参数。在这个例子中,参数之间类型推断是不可行的。
那如何修改呢?我们先看下面的知识点。
2.柯里化 currying
指的是讲原来接受两个参数的函数变成新的一个接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。
def addTwo(x : Int) = (y : Int) => x+y
这个函数接受一个参数,生成了另一个接受一个参数的函数。
如果我们要调用计算两个数的和,那需要:
addTwo(2)(3)
分开来讲,addTwo(2)的结果是(y: Int)=> 2+y。然后这个函数又被应用到3,所以最后结果是5。
Scala支持如下简写来实现柯里化:
scala> def addTwo(x: Int)(y:Int)=x+y
在这里,我们可以应用柯里化,把其中的一个函数单独另出来,以便提供参数推断的信息。
所以在第一部分中讲的那个错误的例子可以改写成:
def test[A](a: List[A])(f: A => A) = a.map(f) test(List(1))(_+1)
结束。