|    192  |    189  | 
|    193 Bird("Sparrow") |    190 Bird("Sparrow") | 
|    194 println(Bird("Sparrow")) |    191 println(Bird("Sparrow")) | 
|    195 println(Bird("Sparrow").toString) |    192 println(Bird("Sparrow").toString) | 
|    196  |    193  | 
|         |    194 Bird("Sparrow").copy(name = "House Sparrow") | 
|         |    195  | 
|         |    196 def group(a : Animal) = a match { | 
|         |    197   case Bird(_) => "It's a bird" | 
|         |    198   case Mammal(_) => "It's a mammal" | 
|         |    199 } | 
|         |    200  | 
|    197  |    201  | 
|    198 // There is a very convenient short-hand notation |    202 // There is a very convenient short-hand notation | 
|    199 // for constructors: |    203 // for constructors: | 
|    200  |    204  | 
|    201 class Fraction(x: Int, y: Int) { |    205 class Fraction(x: Int, y: Int) { | 
|    202   def numer = x |    206   def numer = x | 
|    203   def denom = y |    207   def denom = y | 
|    204 } |    208 } | 
|    205  |    209  | 
|    206 val half = new Fraction(1, 2) |    210 val half = new Fraction(1, 2) | 
|         |    211 half.numer | 
|    207  |    212  | 
|    208 case class Fraction(numer: Int, denom: Int) |    213 case class Fraction(numer: Int, denom: Int) | 
|    209  |    214  | 
|    210 val half = Fraction(1, 2) |    215 val half = Fraction(1, 2) | 
|    211  |    216  | 
|         |    217 half.numer | 
|    212 half.denom |    218 half.denom | 
|    213  |    219  | 
|    214  |    220  | 
|    215 // In mandelbrot.scala I used complex (imaginary) numbers  |    221 // In mandelbrot.scala I used complex (imaginary) numbers  | 
|    216 // and implemented the usual arithmetic operations for complex  |    222 // and implemented the usual arithmetic operations for complex  | 
|    226   def abs = Math.sqrt(this.re * this.re + this.im * this.im) |    232   def abs = Math.sqrt(this.re * this.re + this.im * this.im) | 
|    227 } |    233 } | 
|    228  |    234  | 
|    229 val test = Complex(1, 2) + Complex (3, 4) |    235 val test = Complex(1, 2) + Complex (3, 4) | 
|    230  |    236  | 
|         |    237 import scala.language.postfixOps | 
|         |    238 List(5,4,3,2,1).sorted.reverse | 
|         |    239  | 
|    231 // this could have equally been written as |    240 // this could have equally been written as | 
|    232 val test = Complex(1, 2).+(Complex (3, 4)) |    241 val test = Complex(1, 2).+(Complex (3, 4)) | 
|    233  |    242  | 
|    234 // this applies to all methods, but requires |    243 // this applies to all methods, but requires | 
|    235 import scala.language.postfixOps |    244 import scala.language.postfixOps | 
|    268       balance |    277       balance | 
|    269     } else throw new Error("insufficient funds") |    278     } else throw new Error("insufficient funds") | 
|    270 } |    279 } | 
|    271  |    280  | 
|    272 // BUT since we are completely IMMUTABLE, this is  |    281 // BUT since we are completely IMMUTABLE, this is  | 
|    273 // virtually of not concern to us. |    282 // virtually of no concern to us. | 
|    274  |    283  | 
|    275  |    284  | 
|    276  |    285  | 
|    277 // another example about Fractions |    286 // another example about Fractions | 
|    278 import scala.language.implicitConversions |    287 import scala.language.implicitConversions | 
|    279 import scala.language.reflectiveCalls |    288 import scala.language.reflectiveCalls | 
|    280  |    289  | 
|    281  |         | 
|    282 case class Fraction(numer: Int, denom: Int) { |    290 case class Fraction(numer: Int, denom: Int) { | 
|    283   override def toString = numer.toString + "/" + denom.toString |    291   override def toString = numer.toString + "/" + denom.toString | 
|    284  |    292  | 
|    285   def +(other: Fraction) = Fraction(numer + other.numer, denom + other.denom) |    293   def +(other: Fraction) =  | 
|    286   def /(other: Fraction) = Fraction(numer * other.denom, denom * other.numer) |    294     Fraction(numer * other.denom + other.numer * denom,  | 
|         |    295              denom * other.denom) | 
|         |    296   def *(other: Fraction) = Fraction(numer * other.numer, denom * other.denom) | 
|    287  } |    297  } | 
|    288  |    298  | 
|    289 implicit def Int2Fraction(x: Int) = Fraction(x, 1) |    299 implicit def Int2Fraction(x: Int) = Fraction(x, 1) | 
|    290  |         | 
|    291  |    300  | 
|    292 val half = Fraction(1, 2) |    301 val half = Fraction(1, 2) | 
|    293 val third = Fraction (1, 3) |    302 val third = Fraction (1, 3) | 
|    294  |    303  | 
|    295 half + third |    304 half + third | 
|    296 half / third |    305 half * third | 
|    297  |    306  | 
|    298 (1 / 3) + half |    307 1 + half | 
|    299 (1 / 2) + third |    308  | 
|         |    309  | 
|    300  |    310  | 
|    301  |    311  | 
|    302 // DFAs in Scala   |    312 // DFAs in Scala   | 
|    303 //=============== |    313 //=============== | 
|    304 import scala.util.Try |    314 import scala.util.Try | 
|    315     case Nil => q |    325     case Nil => q | 
|    316     case c::cs => deltas(delta(q, c), cs) |    326     case c::cs => deltas(delta(q, c), cs) | 
|    317   } |    327   } | 
|    318  |    328  | 
|    319   def accepts(s: List[C]) : Boolean =  |    329   def accepts(s: List[C]) : Boolean =  | 
|    320     Try(fins(deltas(start, s))) getOrElse false |    330     Try(fins(deltas(start, s))).getOrElse(false) | 
|    321 } |    331 } | 
|    322  |    332  | 
|    323 // the example shown in the handout  |    333 // the example shown in the handout  | 
|    324 abstract class State |    334 abstract class State | 
|    325 case object Q0 extends State |    335 case object Q0 extends State | 
|    357                      fins:  A => Boolean) {   // final states  |    367                      fins:  A => Boolean) {   // final states  | 
|    358  |    368  | 
|    359   // given a state and a character, what is the set of  |    369   // given a state and a character, what is the set of  | 
|    360   // next states? if there is none => empty set |    370   // next states? if there is none => empty set | 
|    361   def next(q: A, c: C) : Set[A] =  |    371   def next(q: A, c: C) : Set[A] =  | 
|    362     Try(delta(q, c)) getOrElse Set[A]()  |    372     Try(delta(q, c)).getOrElse(Set[A]())  | 
|    363  |    373  | 
|    364   def nexts(qs: Set[A], c: C) : Set[A] = |    374   def nexts(qs: Set[A], c: C) : Set[A] = | 
|    365     qs.flatMap(next(_, c)) |    375     qs.flatMap(next(_, c)) | 
|    366  |    376  | 
|    367   // depth-first version of accepts |    377   // depth-first version of accepts | 
|    395  |    405  | 
|    396  |    406  | 
|    397 // Q: Why the kerfuffle about the polymorphic types in DFAs/NFAs? |    407 // Q: Why the kerfuffle about the polymorphic types in DFAs/NFAs? | 
|    398 // A: Subset construction. Here the state type for the DFA is |    408 // A: Subset construction. Here the state type for the DFA is | 
|    399 //    sets of states. |    409 //    sets of states. | 
|         |    410  | 
|    400  |    411  | 
|    401 def subset[A, C](nfa: NFA[A, C]) : DFA[Set[A], C] = { |    412 def subset[A, C](nfa: NFA[A, C]) : DFA[Set[A], C] = { | 
|    402   DFA(nfa.starts,  |    413   DFA(nfa.starts,  | 
|    403       { case (qs, c) => nfa.nexts(qs, c) },  |    414       { case (qs, c) => nfa.nexts(qs, c) },  | 
|    404       _.exists(nfa.fins)) |    415       _.exists(nfa.fins)) |