Scala支持Case Class的概念。Case Class是也是普通类,但其导出构造参数,并通过模式匹配提供递归分解机制。
下面实例包括一个抽象超类Term和三个实体类Var,Fun和App。
abstract class Term
case class Var(name: String) extends Term
case class Fun(arg: String, body: Term) extends Term
case class App(f: Term, v: Term) extends Term
这种类结构可以用来表示untyped lambda calculus(http://drona.csa.iisc.ernet.in/~deepakd/pav/lecture-notes.pdf)。构造case class的实例,不需要使用new,可以简单地使用类的名字来作为一个函数。
val x = Var("x")
Console.println(x.name)
对于每个case class,Scala编译器为其自动生成equals方法和toString方法。比如:
val x1 = Var("x")
val x2 = Var("x")
val y1 = Var("y")
println("" + x1 + " == " + x2 + " => " + (x1 == x2))
println("" + x1 + " == " + y1 + " => " + (x1 == y1))
输出为:
Var(x) == Var(x) => true
Var(x) == Var(y) => false
只有在模式匹配用于分解数据结构时才定义case class。下面的Object定义一个为lambda计算提供一个输出函数:
object TermTest extends Application {
def printTerm(term: Term) {
term match {
case Var(n) =>
print(n)
case Fun(x, b) =>
print("^" + x + ".")
printTerm(b)
case App(f, v) =>
Console.print("(")
printTerm(f)
print(" ")
printTerm(v)
print(")")
}
}
def isIdentityFun(term: Term): Boolean = term match {
case Fun(x, Var(y)) if x == y => true
case _ => false
}
val id = Fun("x", Var("x"))
val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))
printTerm(t)
println
println(isIdentityFun(id))
println(isIdentityFun(t))
}
实例代码中,通过match关键字和一系列case Pattern => Body代码段构成了模式匹配。上面的代码还定义了一个isIdentityFun。在满足Pattern后,通过if来判断值是否相等,如果相等返回true。否则继续匹配Pattern,实例中直接返回了false。
代码输出为:
^x.^y.(x y)
true
false