31 // Option[...]: None, Some(_)  | 
    31 // Option[...]: None, Some(_)  | 
    32   | 
    32   | 
    33 def safe_div(x: Int, y: Int) : Option[Int] =   | 
    33 def safe_div(x: Int, y: Int) : Option[Int] =   | 
    34   if (y == 0) None else Some(x / y)  | 
    34   if (y == 0) None else Some(x / y)  | 
    35   | 
    35   | 
    36 safe_div(10 + 5, 4 - 1)    | 
    36 safe_div(10 + 5, 0)    | 
    37   | 
    37   | 
    38 List(1,2,3,4,5,6).indexOf(7)  | 
    38 List(1,2,3,4,5,6).indexOf(7)  | 
    39 List[Int]().min  | 
    39 List[Int]().min  | 
    40 List[Int]().minOption  | 
    40 List[Int](3,4,5).minOption  | 
    41   | 
    41   | 
    42 def my_min(ls: List[Int]) : Option[Int] =   | 
         | 
    43   ls.minOption  | 
         | 
    44   | 
         | 
    45 my_min(List(1,2,3,4))  | 
         | 
    46   | 
    42   | 
    47   | 
    43   | 
    48 // better error handling with Options (no exceptions)  | 
    44 // better error handling with Options (no exceptions)  | 
    49 //  | 
    45 //  | 
    50 //  Try(something).getOrElse(what_to_do_in_case_of_an_exception)  | 
    46 //  Try(something).getOrElse(what_to_do_in_case_of_an_exception)  | 
    51 //  | 
    47 //  | 
    52   | 
    48   | 
    53 import scala.util._      // Try,...  | 
    49 import scala.util._      // Try,...  | 
    54 import io.Source         // fromURL  | 
    50 import io.Source         // fromURL  | 
    55   | 
    51   | 
    56 val my_url = "https://nms.kcl.ac.uk/christian.urban/"  | 
    52 val my_url = "https://nms.kcl.ac.uk/christian.urban2/"  | 
    57   | 
    53   | 
    58 Source.fromURL(my_url)("ISO-8859-1").mkString | 
    54 Source.fromURL(my_url)("ISO-8859-1").mkString | 
    59 Source.fromURL(my_url)("ISO-8859-1").getLines().toList | 
    55 Source.fromURL(my_url)("ISO-8859-1").getLines().toList | 
    60   | 
    56   | 
    61 Try(Source.fromURL(my_url)("ISO-8859-1").mkString).getOrElse("") | 
    57 Try(Source.fromURL(my_url)("ISO-8859-1").mkString).getOrElse("") | 
   172 // and produce functions as result  | 
   168 // and produce functions as result  | 
   173   | 
   169   | 
   174 def even(x: Int) : Boolean = x % 2 == 0  | 
   170 def even(x: Int) : Boolean = x % 2 == 0  | 
   175 def odd(x: Int) : Boolean = x % 2 == 1  | 
   171 def odd(x: Int) : Boolean = x % 2 == 1  | 
   176   | 
   172   | 
         | 
   173 def inc(x: Int) : Int = x + 1  | 
   177 val lst = (1 to 10).toList  | 
   174 val lst = (1 to 10).toList  | 
   178   | 
   175   | 
   179 lst.filter(even)  | 
   176 lst.filter(_ % 2 == 0)  | 
   180 lst.count(odd)  | 
   177 lst.count(odd)  | 
   181 lst.find(even)  | 
   178 lst.find(even)  | 
   182 lst.exists(even)  | 
   179 lst.exists(even)  | 
   183   | 
   180   | 
   184 lst.find(_ < 4)  | 
   181 lst.find(_ < 4)  | 
   185 lst.filter(_ < 4)   | 
   182 lst.filter(_ < 4)   | 
   186   | 
   183   | 
         | 
   184 val x = 3 < 4  | 
         | 
   185   | 
   187 def less4(x: Int) : Boolean = x < 4  | 
   186 def less4(x: Int) : Boolean = x < 4  | 
   188 lst.find(less4)  | 
   187 lst.find(less4)  | 
   189 lst.find(_ < 4)  | 
   188 lst.find(x => !(x < 4))  | 
   190   | 
   189   | 
   191 lst.filter(x => x % 2 == 0)  | 
   190 lst.filter(x => x % 2 == 0)  | 
   192 lst.filter(_ % 2 == 0)  | 
   191 lst.filter(_ % 2 == 0)  | 
   193   | 
   192   | 
   194   | 
   193   | 
   228 lst.map(x => (double(x), square(x)))  | 
   227 lst.map(x => (double(x), square(x)))  | 
   229   | 
   228   | 
   230 // works also for strings  | 
   229 // works also for strings  | 
   231 def tweet(c: Char) = c.toUpper  | 
   230 def tweet(c: Char) = c.toUpper  | 
   232   | 
   231   | 
   233 "Hello World".map(tweet)  | 
   232 "Hello\nWorld".map(tweet)  | 
   234   | 
   233   | 
   235   | 
   234   | 
   236 // this can be iterated  | 
   235 // this can be iterated  | 
   237   | 
   236   | 
   238 lst.map(square).filter(_ > 4)  | 
   237 lst.map(square).filter(_ > 4)  | 
   349 lst.groupBy(_.length).get(3)  | 
   348 lst.groupBy(_.length).get(3)  | 
   350   | 
   349   | 
   351 val grps = lst.groupBy(_.length)  | 
   350 val grps = lst.groupBy(_.length)  | 
   352 grps.keySet  | 
   351 grps.keySet  | 
   353   | 
   352   | 
         | 
   353 // naive quicksort with "On" function  | 
         | 
   354   | 
         | 
   355 def sortOn(f: Int => Int, xs: List[Int]) : List[Int] = { | 
         | 
   356   if (xs.size < 2) xs  | 
         | 
   357   else { | 
         | 
   358    val pivot = xs.head  | 
         | 
   359    val (left, right) = xs.partition(f(_) < f(pivot))  | 
         | 
   360    sortOn(f, left) ::: pivot :: sortOn(f, right.tail)  | 
         | 
   361   }  | 
         | 
   362 }   | 
         | 
   363   | 
         | 
   364 sortOn(identity, List(99,99,99,98,10,-3,2))   | 
         | 
   365 sortOn(n => - n, List(99,99,99,98,10,-3,2))  | 
   354   | 
   366   | 
   355   | 
   367   | 
   356   | 
   368   | 
   357 // Pattern Matching  | 
   369 // Pattern Matching  | 
   358 //==================  | 
   370 //==================  |