513 // nothing is perfect.   | 
   513 // nothing is perfect.   | 
   514   | 
   514   | 
   515   | 
   515   | 
   516   | 
   516   | 
   517   | 
   517   | 
   518 // Polymorphic Types  | 
   518   | 
   519 //===================  | 
   519   | 
   520   | 
         | 
   521 // You do not want to write functions like contains, first   | 
         | 
   522 // and so on for every type of lists.  | 
         | 
   523   | 
         | 
   524   | 
         | 
   525 def length_string_list(lst: List[String]): Int = lst match { | 
         | 
   526   case Nil => 0  | 
         | 
   527   case x::xs => 1 + length_string_list(xs)  | 
         | 
   528 }  | 
         | 
   529   | 
         | 
   530 def length_int_list(lst: List[Int]): Int = lst match { | 
         | 
   531   case Nil => 0  | 
         | 
   532   case x::xs => 1 + length_int_list(xs)  | 
         | 
   533 }  | 
         | 
   534   | 
         | 
   535 length_string_list(List("1", "2", "3", "4")) | 
         | 
   536 length_int_list(List(1, 2, 3, 4))  | 
         | 
   537   | 
         | 
   538 //-----  | 
         | 
   539 def length[A](lst: List[A]): Int = lst match { | 
         | 
   540   case Nil => 0  | 
         | 
   541   case x::xs => 1 + length(xs)  | 
         | 
   542 }  | 
         | 
   543 length(List("1", "2", "3", "4")) | 
         | 
   544 length(List(1, 2, 3, 4))  | 
         | 
   545   | 
         | 
   546 def map[A, B](lst: List[A], f: A => B): List[B] = lst match { | 
         | 
   547   case Nil => Nil  | 
         | 
   548   case x::xs => f(x)::map_int_list(xs, f)   | 
         | 
   549 }  | 
         | 
   550   | 
         | 
   551 map_int_list(List(1, 2, 3, 4), square)  | 
         | 
   552   | 
         | 
   553   | 
         | 
   554   | 
         | 
   555   | 
         | 
   556   | 
         | 
   557   | 
         | 
   558 // Cool Stuff  | 
         | 
   559 //============  | 
         | 
   560   | 
         | 
   561   | 
         | 
   562 // Implicits   | 
         | 
   563 //===========  | 
         | 
   564 //  | 
         | 
   565 // For example adding your own methods to Strings:  | 
         | 
   566 // Imagine you want to increment strings, like  | 
         | 
   567 //  | 
         | 
   568 //     "HAL".increment  | 
         | 
   569 //  | 
         | 
   570 // you can avoid ugly fudges, like a MyString, by  | 
         | 
   571 // using implicit conversions.  | 
         | 
   572   | 
         | 
   573   | 
         | 
   574 implicit class MyString(s: String) { | 
         | 
   575   def increment = for (c <- s) yield (c + 1).toChar   | 
         | 
   576 }  | 
         | 
   577   | 
         | 
   578 "HAL".increment  | 
         | 
   579   | 
         | 
   580   | 
         | 
   581   | 
         | 
   582   | 
         | 
   583   | 
         | 
   584   | 
         |