progs/lecture2.scala
changeset 363 e5c1d69cffa4
parent 362 1bde878ba6c9
child 364 f1a6fa599d26
--- a/progs/lecture2.scala	Tue Nov 17 00:34:55 2020 +0000
+++ b/progs/lecture2.scala	Wed Nov 18 01:54:39 2020 +0000
@@ -1,6 +1,6 @@
 // Scala Lecture 2
 //=================
-
+ 
 
 // String Interpolations
 //=======================
@@ -272,11 +272,41 @@
 
 lst.map(square).filter(_ > 4)
 
-(lst.map(square)
+lst.map(square).find(_ > 4)
+lst.map(square).find(_ > 4).map(double)
+
+lst.map(square)
    .find(_ > 4)
-   .map(square))
+   .map(double)
+
+
+// Option Type and maps
+//======================
+
+// a function that turns strings into numbers (similar to .toInt)
+Integer.parseInt("12u34")
+
+// maps on Options
+
+import scala.util._
 
-lst.map(square).find(_ > 4)
+def get_me_an_int(s: String) : Option[Int] = 
+ Try(Some(Integer.parseInt(s))).getOrElse(None)
+
+get_me_an_int("12345").map(_ % 2 == 0)
+get_me_an_int("12u34").map(_ % 2 == 0)
+
+
+
+val lst = List("12345", "foo", "5432", "bar", "x21", "456")
+for (x <- lst) yield get_me_an_int(x)
+
+// summing up all the numbers
+
+lst.map(get_me_an_int).flatten.sum
+
+
+
 
 // this is actually how for-comprehensions are
 // defined in Scala
@@ -288,14 +318,14 @@
 // type of functions is for example Int => Int
 
 
-def my_map_int(lst: List[Int], f: Int => Int) : List[Int] = {
+def my_map_int(lst: List[Int], f: Int => Int) : List[Int] = 
+{
   if (lst == Nil) Nil
   else f(lst.head) :: my_map_int(lst.tail, f)
 }
 
 my_map_int(lst, square)
 
-
 // same function using pattern matching: a kind
 // of switch statement on steroids (see more later on)
 
@@ -306,87 +336,19 @@
   }
 
 
+
+val biglst = (1 to 10000).toList
+my_map_int(biglst, double)
+
+(1 to 10000000).toList.map(double)
+
 // other function types
 //
 // f1: (Int, Int) => Int
 // f2: List[String] => Option[Int]
 // ... 
-val lst = (1 to 10).toList
-
-lst.sum
-
-val lst = List(1,2,3,4)
-
-lst.head
-lst.tail
-
-def sumOf(f: Int => Int, lst: List[Int]): Int = 
-lst match {
-  case Nil => 0
-  case x::foo => f(x) + sumOf(f, foo)
-}
-
-def sum_squares(lst: List[Int]) = sumOf(square, lst)
-def sum_cubes(lst: List[Int])   = sumOf(x => x * x * x, lst)
-
-sum_squares(lst)
-sum_cubes(lst)
-
-// lets try a factorial
-def fact(n: Int) : Int = 
-  if (n == 0) 1 else n * fact(n - 1)
-
-def sum_fact(lst: List[Int]) = sumOf(fact, lst)
-sum_fact(lst)
-
 
 
-// sometimes it is needed that you specify the type. 
-(1 to 100).filter((x: Int) => x % 2 == 0).sum 
-
-// in this case it is clear that x must be an Int
-(1 to 100).filter(x => x % 2 == 0).sum
-
-// When each parameter (only x in this case) is used only once
-// you can use the wizardy placeholder syntax
-(1 to 100).filter(_ % 2 == 0).sum
-
-
-
-// Option Type and maps
-//======================
-
-// a function that turns strings into numbers (similar to .toInt)
-Integer.parseInt("12u34")
-
-import scala.util._
-
-def get_me_an_int(s: String) : Option[Int] = 
- Try(Some(Integer.parseInt(s))).getOrElse(None)
-
-val lst = List("12345", "foo", "5432", "bar", "x21", "456")
-for (x <- lst) yield get_me_an_int(x)
-
-// summing up all the numbers
-
-lst.map(get_me_an_int).flatten.sum
-lst.map(get_me_an_int).flatten.sum
-
-lst.flatMap(get_me_an_int).sum
-
-// maps on Options
-
-get_me_an_int("12345").map(even)
-get_me_an_int("12u34").map(even)
-
-def my_map_option(o: Option[Int], f : Int => Int) : Option[Int] = {
-o match {
-   case None => None
-   case Some(foo) => Some(f(foo))
-}}
-
-my_map_option(Some(4), square)
-my_map_option(None, square)