Home > Scala > Scala : Partial Functions 和 Type Parameters

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:

  1. Scala : Functions and Parameters
  2. Scala : 作用域中的变量,容器
  3. Scala 集合框架:Tuple,Map[K,V],Option[T]
  4. Scala 集合框架:List
  5. Scala : 交互式应用程序,函数组合
Categories: Scala Tags:
  1. No comments yet.
  1. No trackbacks yet.