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