|         |      1 // DFAs in Scala using partial functions | 
|         |      2 import scala.util.Try | 
|         |      3  | 
|         |      4 // type abbreviation for partial functions | 
|         |      5 type :=>[A, B] = PartialFunction[A, B] | 
|         |      6  | 
|         |      7 case class DFA[A, C](start: A,              // starting state | 
|         |      8                      delta: (A, C) :=> A,   // transition (partial fun) | 
|         |      9                      fins:  A => Boolean) { // final states | 
|         |     10  | 
|         |     11   def deltas(q: A, s: List[C]) : A = s match { | 
|         |     12     case Nil => q | 
|         |     13     case c::cs => deltas(delta(q, c), cs) | 
|         |     14   } | 
|         |     15  | 
|         |     16   def accepts(s: List[C]) : Boolean =  | 
|         |     17     Try(fins(deltas(start, s))) getOrElse false | 
|         |     18 } | 
|         |     19  | 
|         |     20 // the example shown earlier in the handout  | 
|         |     21 abstract class State | 
|         |     22 case object Q0 extends State | 
|         |     23 case object Q1 extends State | 
|         |     24 case object Q2 extends State | 
|         |     25 case object Q3 extends State | 
|         |     26 case object Q4 extends State | 
|         |     27  | 
|         |     28 val delta : (State, Char) :=> State =  | 
|         |     29   { case (Q0, 'a') => Q1 | 
|         |     30     case (Q0, 'b') => Q2 | 
|         |     31     case (Q1, 'a') => Q4 | 
|         |     32     case (Q1, 'b') => Q2 | 
|         |     33     case (Q2, 'a') => Q3 | 
|         |     34     case (Q2, 'b') => Q2 | 
|         |     35     case (Q3, 'a') => Q4 | 
|         |     36     case (Q3, 'b') => Q0 | 
|         |     37     case (Q4, 'a') => Q4 | 
|         |     38     case (Q4, 'b') => Q4 } | 
|         |     39  | 
|         |     40 val dfa = DFA(Q0, delta, Set[State](Q4)) | 
|         |     41  | 
|         |     42 dfa.accepts("bbabaab".toList)   // true | 
|         |     43 dfa.accepts("baba".toList)      // false |