2010-04-12

Case Classes

Scala 里有个叫做 "case classes" 的东西,这个应该是从 ML 家族的语言特性启发而来,习惯于 C/C++ 的程序员可能较少看到这个名词。比如,我们要写一个算术表达式解析器,比如下面就是一些合法的表达式:

  • 5

  • -5

  • 2+3

  • foo

  • 4 + foo


这在ML家族语言比如Haskell中非常容易表达。如下,这也是迄今为止我看到的最简洁的表达方式(看起来直接就是EBNF的描述方法):

> data Expr =
>     Number Int
>   | Var String
>   | UnOp String Expr
>   | BinOp String Expr Expr
> deriving (Show)


Scala 中用 "case classes" 来描述,如下:

abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr


看起来没有 Haskell 那么简单直接,但远远聊胜于无了:

scala> val op = BinOp("+", Number(1), Var("x"))
op: BinOp = BinOp(+,Number(1.0),Var(x))


Haskell中类似,

ghci> let op = BinOp "+" (Number 1) (Var "x")
ghci> op

BinOp "+" (Number 1) (Var "x")

标签: ,

0 Comments:

发表评论

<< Home