Scala Case Class

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

转载于:https://my.oschina.net/dingohaha60/blog/276742

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值