Scala : Partial Functions 和 Type Parameters
方法和函数是不同的,在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
方法可以拥有类型参数:类型参数定义了其它的类型或方法的返回值类型。但注意函数不能接收类型参数,一个的参数和返回值必须在函数定义时创建。
下面定义了一个接收Int 返回 T 类型的函数:
scala> def t42[T](f: Int => T): T = f(42) t42: [T](f: (Int) => T)T
所以这时能传递函数 f 作为参数:
scala> val f: Int => String = x => "Dude: "+x f: (Int) => String = scala> t42(f) res7: String = Dude: 42
但如果传递一个返回Int类型的函数,t42将返回:
scala> t42(1 +) res8: Int = 43
同样的,可以传递一个返回为 List[Int]类型的函数:
scala> val intList: Int => List[Int] = i => (1 to i).toList intList: (Int) => List[Int] = scala> t42(intList) res9: List[Int] = List(1, 2, 3,...., 41, 42)
在前面的例子中,并不用明确地定义类型参数,然而也可以显式地定义它:
scala> t42[Int](1 +) res10: Int = 43
Related posts:
评论