1 // Scala Lecture 1  | 
     1 // Scala Lecture 1  | 
     2 //=================  | 
     2 //=================  | 
     3   | 
     3   | 
     4 // - List, Sets, Strings, ...   | 
     4 // - List, Sets, Ints, Strings, ...   | 
     5 // - Value assignments (val vs var)  | 
     5 // - Value assignments (val vs var)  | 
     6 // - How to define functions? (What is returned?)  | 
     6 // - How to define functions? (What is returned?)  | 
     7 // - If-Conditions  | 
     7 // - If-Conditions  | 
     8 // - For-Comprehensions (guards, with/without yield)  | 
     8 // - For-Comprehensions (guards, with/without yield)  | 
     9 // - String-Interpolations  | 
     9 // - String-Interpolations  | 
    82 (1 until 10).toList  | 
    66 (1 until 10).toList  | 
    83   | 
    67   | 
    84   | 
    68   | 
    85 // Equality in Scala is structural  | 
    69 // Equality in Scala is structural  | 
    86 //=================================  | 
    70 //=================================  | 
    87 val a = "Dave"  | 
    71 val a = "Dave2"  | 
    88 val b = "Dave"  | 
    72 val b = "Dave"  | 
    89   | 
    73   | 
    90 if (a == b) println("Equal") else println("Unequal") | 
    74 if (a == b) println("Equal") else println("Unequal") | 
    91   | 
    75   | 
    92 Set(1,2,3) == Set(3,1,2)  | 
    76 Set(1,2,3) == Set(3,1,2)  | 
   157   | 
   141   | 
   158 "1,2,3,4,5".split(",").mkString("\n") | 
   142 "1,2,3,4,5".split(",").mkString("\n") | 
   159 "1,2,3,4,5".split(",").toList | 
   143 "1,2,3,4,5".split(",").toList | 
   160 "1,2,3,4,5".split(",3,").mkString("\n") | 
   144 "1,2,3,4,5".split(",3,").mkString("\n") | 
   161   | 
   145   | 
   162 "abcdefg".startsWith("abc") | 
         | 
   163   | 
   146   | 
   164   | 
   147   | 
   165 // Types (see slide)  | 
   148 // Types (see slide)  | 
   166 //===================  | 
   149 //===================  | 
   167   | 
   150   | 
   237 // type to each argument and a return type of the function  | 
   220 // type to each argument and a return type of the function  | 
   238 //  | 
   221 //  | 
   239 //  def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { | 
   222 //  def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { | 
   240 //     ....  | 
   223 //     ....  | 
   241 //  }  | 
   224 //  }  | 
         | 
   225   | 
         | 
   226   | 
         | 
   227 // > LENGTH OF LIST EXAMPLE  | 
         | 
   228 def len(xs: List[Int], acc: Int) : Int = { | 
         | 
   229    if (xs == Nil) acc  | 
         | 
   230    else foo(xs.tail, acc + 1)  | 
         | 
   231 }  | 
         | 
   232   | 
         | 
   233 def len(xs: List[Int]) : Int = foo(xs, 0)  | 
         | 
   234   | 
         | 
   235 len(List(1,2,3,4,1))  | 
         | 
   236   | 
         | 
   237   | 
         | 
   238 def len(xs: List[Int]) : Int = { | 
         | 
   239     if (xs == Nil) 0  | 
         | 
   240     else (1 + len(xs.tail))  | 
         | 
   241 }      | 
         | 
   242   | 
         | 
   243   | 
         | 
   244   | 
         | 
   245 len(List(1,2,3,4,1))  | 
         | 
   246   | 
         | 
   247   | 
         | 
   248   | 
         | 
   249 def len(xs: List[Int]) : Int = xs match { | 
         | 
   250    case Nil => 0  | 
         | 
   251    case x :: xs => 1 + len(xs)  | 
         | 
   252 }  | 
         | 
   253   | 
         | 
   254 len(List(1,2,3,4,1))  | 
   242   | 
   255   | 
   243   | 
   256   | 
   244   | 
   257   | 
   245 // If-Conditionals  | 
   258 // If-Conditionals  | 
   246 //=================  | 
   259 //=================  | 
   316 for (n <- lst) yield {  | 
   329 for (n <- lst) yield {  | 
   317   square(n) + double(n)  | 
   330   square(n) + double(n)  | 
   318 }  | 
   331 }  | 
   319   | 
   332   | 
   320 for (n <- (1 to 10).toList;   | 
   333 for (n <- (1 to 10).toList;   | 
   321      m <- (1 to 5).toList) yield (n, m, n * m)  | 
   334      m <- (1 to 5).toList) yield (n, m)  | 
   322   | 
   335   | 
   323   | 
   336   | 
   324 // you can assign the result of a for-comprehension  | 
   337 // you can assign the result of a for-comprehension  | 
   325 // to a value  | 
   338 // to a value  | 
   326 val mult_table =   | 
   339 val mult_table =   | 
   327   for (n <- (1 to 10).toList;   | 
   340   for (n <- (1 to 10).toList;   | 
   328        m <- (1 to 10).toList) yield n * m  | 
   341        m <- (1 to 10).toList) yield n * m  | 
   329   | 
   342   | 
   330 println(mult_table.mkString)  | 
   343 println(mult_table.mkString(",")) | 
   331 mult_table.sliding(10,10).mkString("\n") | 
   344 mult_table.sliding(10,10).toList  | 
         | 
   345   | 
         | 
   346   | 
         | 
   347 .mkString("\n") | 
   332   | 
   348   | 
   333 // for-comprehensions also work for other  | 
   349 // for-comprehensions also work for other  | 
   334 // collections  | 
   350 // collections  | 
   335   | 
   351   | 
   336 for (n <- Set(10,12,4,5,7,8,10)) yield n * n  | 
   352 for (n <- Set(10,12,4,5,7,8,10)) yield n * n  | 
   337   | 
   353   | 
   338 for (n <- (1 to 10)) yield { | 
   354 for (n <- (1 to 10)) yield { | 
         | 
   355   | 
   339   n * n    | 
   356   n * n    | 
   340 }  | 
   357 }  | 
   341   | 
   358   | 
   342 // with if-predicates / filters  | 
   359 // with if-predicates / filters  | 
         | 
   360   | 
         | 
   361 val xs = for (n <- (1 to 3).toList;   | 
         | 
   362      m <- (1 to 3).toList) yield (n,m)  | 
         | 
   363   | 
         | 
   364 xs.filter{case (m, n) => (n + m) % 2 == 0}     | 
   343   | 
   365   | 
   344 for (n <- (1 to 3).toList;   | 
   366 for (n <- (1 to 3).toList;   | 
   345      m <- (1 to 3).toList;  | 
   367      m <- (1 to 3).toList;  | 
   346      if (n + m) % 2 == 0) yield (n, m)  | 
   368      if (n + m) % 2 == 0) yield (n, m)  | 
   347   | 
   369   | 
   348   | 
   370   | 
   349 // with patterns  | 
   371 // with patterns  | 
   350   | 
   372   | 
   351 val lst = List((1, 4), (2, 3), (3, 2), (4, 1))  | 
   373 val lst = List((1, 4), (2, 3), (3, 2), (4, 1))  | 
   352   | 
   374   | 
   353 for ((m, n) <- lst) yield m + n   | 
   375 ` yield m + n   | 
   354   | 
   376   | 
   355 for (p <- lst) yield p._1 + p._2   | 
   377 for (p <- lst) yield p._1 + p._2   | 
   356   | 
   378   | 
   357   | 
   379   | 
   358 // general pattern of for-yield   | 
   380 // general pattern of for-yield   | 
   367 //===================  | 
   389 //===================  | 
   368   | 
   390   | 
   369 // with only a side-effect (no list is produced),  | 
   391 // with only a side-effect (no list is produced),  | 
   370 // has no "yield"  | 
   392 // has no "yield"  | 
   371   | 
   393   | 
   372 for (n <- (1 to 10).toList) println(n * n)  | 
   394 val xs = for (n <- (1 to 10).toList) yield println(n * n)  | 
   373   | 
   395   | 
   374 for (n <- (1 to 10).toList) yield n * n  | 
   396 xs.tail  | 
         | 
   397   | 
         | 
   398 val foo = for (n <- (1 to 10).toList) yield n * n  | 
   375   | 
   399   | 
   376   | 
   400   | 
   377 // BTW: a roundabout way of printing out a list, say  | 
   401 // BTW: a roundabout way of printing out a list, say  | 
   378 val lst = ('a' to 'm').toList | 
   402 val lst = ('a' to 'm').toList | 
   379   | 
   403   | 
   448 // Remember:  | 
   472 // Remember:  | 
   449 // - no vars, no ++i, no +=  | 
   473 // - no vars, no ++i, no +=  | 
   450 // - no mutable data-structures (no Arrays, no ListBuffers)  | 
   474 // - no mutable data-structures (no Arrays, no ListBuffers)  | 
   451   | 
   475   | 
   452 // But what the heck....lets try to count to 1 Mio in parallel  | 
   476 // But what the heck....lets try to count to 1 Mio in parallel  | 
         | 
   477 //   | 
         | 
   478 // requires  | 
         | 
   479 // scala-cli --extra-jars scala- parallel-collections_3-1.0.4.jar  | 
         | 
   480   | 
   453 import scala.collection.parallel.CollectionConverters._  | 
   481 import scala.collection.parallel.CollectionConverters._  | 
   454   | 
   482   | 
   455 var cnt = 0  | 
   483 def test() = { | 
   456   | 
   484   var cnt = 0  | 
   457 for(i <- (1 to 100_000).par) cnt += 1  | 
   485   | 
   458   | 
   486   for(i <- (1 to 100_000)) cnt += 1  | 
   459 println(s"Should be 100000: $cnt")  | 
   487   | 
   460   | 
   488   println(s"Should be 100000: $cnt")  | 
   461   | 
   489 }  | 
         | 
   490   | 
         | 
   491 test()  | 
   462   | 
   492   | 
   463 // Or  | 
   493 // Or  | 
   464 // Q: Count how many elements are in the intersections of   | 
   494 // Q: Count how many elements are in the intersections of   | 
   465 //    two sets?  | 
   495 //    two sets?  | 
   466 // A; IMPROPER WAY (mutable counter)  | 
   496 // A; IMPROPER WAY (mutable counter)  |