Archive

Archive for April 21st, 2010

Scala : Partial Functions 和 Type Parameters

April 21st, 2010 leeing No comments

方法和函数是不同的,在Scala中,除了方法以外,一切都是一个实例。方法被附加到实例之上,并且被实例所调用。Function是实现了 FunctionNN trait (NN是指参数的个数,在 Scala 2.8 的文档中可知,NN 的取值范围是 1~22)的实例。在运行时函数没有什么特别的地方,但在编译阶段,有一些方式可以让编写一个函数使用很少的代码。

Partial Functions

Partial function 是只有部份参数被 apply 的函数,在Scala中,可以从方法中来构建 partially applied function:

scala> def plus(a: Int, b: Int) = "Result is: "+(a + b)
plus: (a: Int,b: Int)java.lang.String

scala> val p = (b: Int) => plus(42, b)
p: (Int) => java.lang.String =

partial function 允许你基于已有的方法或函数来构建新的函数,参数可以用不同的括号来分组:

scala> def add(a: Int)(b: Int) = "Result is: "+(a + b)
add: (a: Int)(b: Int)java.lang.String

这样,就可以用下面的語法来调用:

scala> add(1)(2)
res1: java.lang.String = Result is: 3

通过这个語法,你可以传递一个独立于其它参数的代码快作为参数:

scala> add(1){
| val r = new java.util.Random
| r.nextInt(100)
| }
res2: java.lang.String = Result is: 15

同时,也允许很容易地将一个方法提升为一个partially applied function:

scala> def w42(f: Int => String) = f(42)
w42: (f: (Int) => String)String

scala> w42(add(1))
res5: String = Result is: 43

最后,也可以通过partially applying一个方法将它转换为一个函数:

scala> def f2 = add(1) _
f2: (Int) => java.lang.String

此时,这个函数也能被传递给另一个方法:

scala> w42(f2)
res6: String = Result is: 43

Type Parameters

方法可以拥有类型参数:类型参数定义了其它的类型或方法的返回值类型。但注意函数不能接收类型参数,一个的参数和返回值必须在函数定义时创建。

Read more…

Categories: Scala Tags: