https://www.safaribooksonline.com/library/view/scala-for-the/9780134510613/
for yield => map
for yield => map
for yield with guard clause => filter
reduceLeft
clojures - how are they implemented? In scala, they are objects which capture the method and bindings of free variables.
Expression evalutation (Recursive data structures)
abstract class Expr case class Num(value: Int) extends Expr case class Sum(left: Expr, right: Expr) extends Expr case class Product(left: Expr, right: Expr) extends Expr val e = Product(Num(3), Sum(Num(4), Num(5))) def eval(e: Expr):Int = e match { case Num(v) => v case Sum(l,r) => eval(l) + eval(r) case Product(l,r) => eval(l) * eval(r) } eval(e)
Expression evalutation (Recursive data structures) - OOP version
abstract class Expr { def eval: Int } class Num(val data: Int) extends Expr { def eval: Int = data } class Product(val left: Expr, val right: Expr) extends Expr { def eval: Int = left.eval * right.eval } class Sum(val left: Expr, val right: Expr) extends Expr { def eval: Int = left.eval + right.eval } val e = new Product(new Num(3), new Sum(new Num(4), new Num(5))) e.evalSo what to use, Polymorphism version or case classes.
Use case classes when your cases are bound. Like here. There is a finite set of expressions.
Use Polymorphism
No comments:
Post a Comment