|    405 //       case patternN => expressionN |    405 //       case patternN => expressionN | 
|    406 //    } |    406 //    } | 
|    407  |    407  | 
|    408  |    408  | 
|    409 // recall |    409 // recall | 
|    410 val lst = List(None, Some(1), Some(2), None, Some(3)).flatten |    410 def my_map_int(lst: List[Int], f: Int => Int) : List[Int] =  | 
|    411  |    411   lst match { | 
|    412 def my_flatten(xs: List[Option[Int]]): List[Int] =  |    412     case Nil => Nil | 
|    413 xs match { |    413     case x::xs => f(x)::my_map_int(xs, f) | 
|    414   case Nil => Nil  |    414   } | 
|    415   case None::rest => my_flatten(rest) |    415  | 
|    416   case Some(v)::rest => v :: my_flatten(rest) |    416 def my_map_option(o: Option[Int], f: Int => Int) : Option[Int] =  | 
|    417 } |    417   o match { | 
|    418  |    418     case None => None | 
|    419 my_flatten(List(None, Some(1), Some(2), None, Some(3))) |    419     case Some(x) => Some(f(x)) | 
|    420  |    420   } | 
|    421  |    421  | 
|    422 // another example with a default case |    422 my_map_option(None, x => x * x) | 
|    423 def get_me_a_string(n: Int): String = n match { |    423 my_map_option(Some(8), x => x * x) | 
|    424   case 0 | 1 | 2 => "small" |         | 
|    425 } |         | 
|    426  |         | 
|    427 get_me_a_string(3) |         | 
|    428  |    424  | 
|    429  |    425  | 
|    430 // you can also have cases combined |    426 // you can also have cases combined | 
|    431 def season(month: String) : String = month match { |    427 def season(month: String) : String = month match { | 
|    432   case "March" | "April" | "May" => "It's spring" |    428   case "March" | "April" | "May" => "It's spring" | 
|    433   case "June" | "July" | "August" => "It's summer" |    429   case "June" | "July" | "August" => "It's summer" | 
|    434   case "September" | "October" | "November" => "It's autumn" |    430   case "September" | "October" | "November" => "It's autumn" | 
|    435   case "December" => "It's winter" |    431   case "December" => "It's winter" | 
|    436   case "January" | "February" => "It's unfortunately winter" |    432   case "January" | "February" => "It's unfortunately winter" | 
|    437 } |    433   case _ => "Wrong month" | 
|    438   |    434 } | 
|    439 println(season("November")) |    435  | 
|    440  |    436 // pattern-match on integers | 
|    441 // What happens if no case matches? |    437  | 
|    442 println(season("foobar")) |    438 def fib(n: Int) : Int = n match {  | 
|    443  |    439   case 0 | 1 => 1 | 
|    444  |    440   case n => fib(n - 1) + fib(n - 2) | 
|    445 // days of some months |    441 } | 
|    446 def days(month: String) : Int = month match { |    442  | 
|    447   case "March" | "April" | "May" => 31 |    443 fib(10) | 
|    448   case "June" | "July" | "August" => 30 |         | 
|    449 } |         | 
|    450  |         | 
|    451  |    444  | 
|    452 // Silly: fizz buzz |    445 // Silly: fizz buzz | 
|    453 def fizz_buzz(n: Int) : String = (n % 3, n % 5) match { |    446 def fizz_buzz(n: Int) : String = (n % 3, n % 5) match { | 
|    454   case (0, 0) => "fizz buzz" |    447   case (0, 0) => "fizz buzz" | 
|    455   case (0, _) => "fizz" |    448   case (0, _) => "fizz" | 
|    456   case (_, 0) => "buzz" |    449   case (_, 0) => "buzz" | 
|    457   case _ => n.toString   |    450   case _ => n.toString   | 
|    458 } |    451 } | 
|    459  |    452  | 
|    460 for (n <- 0 to 20)  |    453 for (n <- 1 to 20)  | 
|    461  println(fizz_buzz(n)) |    454  println(fizz_buzz(n)) | 
|         |    455  | 
|         |    456  | 
|         |    457 val lst = List(None, Some(1), Some(2), None, Some(3)).flatten | 
|         |    458  | 
|         |    459 def my_flatten(xs: List[Option[Int]]): List[Int] =  | 
|         |    460  xs match { | 
|         |    461    case Nil => Nil  | 
|         |    462    case None::rest => my_flatten(rest) | 
|         |    463    case Some(v)::rest => v :: my_flatten(rest) | 
|         |    464  } | 
|         |    465  | 
|         |    466 my_flatten(List(None, Some(1), Some(2), None, Some(3))) | 
|         |    467  | 
|         |    468  | 
|         |    469  | 
|         |    470   | 
|    462  |    471  | 
|    463  |    472  | 
|    464  |    473  | 
|    465  |    474  | 
|    466 // Recursion |    475 // Recursion | 
|    467 //=========== |    476 //=========== | 
|    468  |         | 
|    469 // well-known example |         | 
|    470  |         | 
|    471 def fib(n: Int) : Int = {  |         | 
|    472   if (n == 0 || n == 1) 1 |         | 
|    473    else fib(n - 1) + fib(n - 2) |         | 
|    474 } |         | 
|    475  |    477  | 
|    476  |    478  | 
|    477 /* Say you have characters a, b, c. |    479 /* Say you have characters a, b, c. | 
|    478    What are all the combinations of a certain length? |    480    What are all the combinations of a certain length? | 
|    479  |    481  |