progs/lecture1.scala
changeset 360 e45d2890749d
parent 359 8aaf187d25f0
child 361 f88b5cec2e5d
equal deleted inserted replaced
359:8aaf187d25f0 360:e45d2890749d
     1 // Scala Lecture 1
     1 // Scala Lecture 1
     2 //=================
     2 //=================
       
     3 
     3 
     4 
     4 
     5 
     5 // Value assignments
     6 // Value assignments
     6 // (their names should be lower case)
     7 // (their names should be lower case)
     7 //====================================
     8 //====================================
       
     9 
     8 
    10 
     9 val x = 42
    11 val x = 42
    10 val y = 3 + 4 
    12 val y = 3 + 4 
    11 val z = x / y
    13 val z = x / y
    12 val x = 70
    14 val x = 70
    13 print(z)
    15 print(z)
       
    16 
    14 
    17 
    15 // (you cannot reassign values: z = 9 will give an error)
    18 // (you cannot reassign values: z = 9 will give an error)
    16 //var z = 9
    19 //var z = 9
    17 //z = 10
    20 //z = 10
    18 
    21 
   290 
   293 
   291 
   294 
   292 // For-Comprehensions (not For-Loops)
   295 // For-Comprehensions (not For-Loops)
   293 //====================================
   296 //====================================
   294 
   297 
   295 (1 to 10).toList
   298 val lst = (1 to 10).toList
   296 for (n <- (1 to 10).toList) yield { 
   299 for (n <- lst) yield n * n 
   297   square(n) + 1
   300 
       
   301 
       
   302 for (n <- lst) yield { 
       
   303   square(n) + double(n)
   298 }
   304 }
   299 
   305 
   300 for (n <- (1 to 10).toList; 
   306 for (n <- (1 to 10).toList; 
   301      m <- (1 to 10).toList) yield (m, n)
   307      m <- (1 to 5).toList) yield (n, m, n * m)
   302 
   308 
   303 
   309 
   304 // you can assign the result of a for-comprehension
   310 // you can assign the result of a for-comprehension
   305 // to a value
   311 // to a value
   306 val mult_table = 
   312 val mult_table = 
   307   for (n <- (1 to 10).toList; 
   313   for (n <- (1 to 10).toList; 
   308        m <- (1 to 10).toList) yield m * n
   314        m <- (1 to 10).toList) yield n * m
   309 
   315 
   310 println(mult_table.mkString)
   316 println(mult_table.mkString)
   311 mult_table.sliding(10,10).mkString("\n")
   317 mult_table.sliding(10,10).mkString("\n")
   312 
   318 
   313 // the list/set/... can also be constructed in any 
   319 // for-comprehensions also work for other
   314 // other way
   320 // collections
   315 
   321 
   316 for (n <- Set(10,12,4,5,7,8,10)) yield n * n
   322 for (n <- Set(10,12,4,5,7,8,10)) yield n * n
   317 
   323 
   318 for (n <- (1 to 10)) yield {
   324 for (n <- (1 to 10)) yield {
   319   n * n  
   325   n * n  
   320 }
   326 }
   321 
   327 
       
   328 // with if-predicates / filters
       
   329 
   322 if (1 == 2) "a" else "b"
   330 if (1 == 2) "a" else "b"
   323 
       
   324 // with if-predicates / filters
       
   325 
   331 
   326 for (n <- (1 to 3).toList; 
   332 for (n <- (1 to 3).toList; 
   327      m <- (1 to 3).toList;
   333      m <- (1 to 3).toList;
   328      if (n + m) % 2 == 0) yield (n, m)
   334      if (n + m) % 2 == 0) yield (n, m)
   329 
   335 
   330 for (n <- (1 to 3).toList; 
       
   331      m <- (1 to 3).toList;
       
   332      if ((((n + m) % 2 == 0)))) yield (n, m)
       
   333 
   336 
   334 // with patterns
   337 // with patterns
   335 
   338 
   336 val lst = List((1, 4), (2, 3), (3, 2), (4, 1))
   339 val lst = List((1, 4), (2, 3), (3, 2), (4, 1))
   337 
   340 
   341 
   344 
   342 
   345 
   343 // general pattern of for-yield 
   346 // general pattern of for-yield 
   344 // (yield can be several lines)
   347 // (yield can be several lines)
   345 
   348 
   346 for (p <- ...) yield {
   349 for (pat <- ...) yield {
   347   // potentially complicated
   350   // potentially complicated
   348   // calculation of a result
   351   // calculation of a result
   349 }
   352 }
       
   353 
       
   354 // For without yield
       
   355 //===================
       
   356 
       
   357 // with only a side-effect (no list is produced),
       
   358 // has no "yield"
       
   359 
       
   360 for (n <- (1 to 10).toList) println(n * n)
       
   361 
       
   362 for (n <- (1 to 10).toList) yield n * n
       
   363 
       
   364 // BTW: a roundabout way of printing out a list, say
       
   365 val lst = ('a' to 'm').toList
       
   366 
       
   367 for (i <- (0 until lst.length)) println(lst(i))
       
   368 
       
   369 // Why not just? Why making your life so complicated?
       
   370 for (c <- lst) println(c)
       
   371 
       
   372 
   350 
   373 
   351 // Functions producing multiple outputs
   374 // Functions producing multiple outputs
   352 //======================================
   375 //======================================
   353 
   376 
   354 def get_ascii(c: Char) : (Char, Int) = 
   377 def get_ascii(c: Char) : (Char, Int) = 
   369 
   392 
   370 strs.maxBy(_._2)
   393 strs.maxBy(_._2)
   371 strs.maxBy(_._1)
   394 strs.maxBy(_._1)
   372 
   395 
   373 
   396 
   374 // For without yield
       
   375 //===================
       
   376 
       
   377 // with only a side-effect (no list is produced),
       
   378 // has no "yield"
       
   379 
       
   380 for (n <- (1 to 10)) println(n)
       
   381 
       
   382 (1 to 10).toList
       
   383 (1 until 10).toList
       
   384 // BTW: a roundabout way of printing out a list, say
       
   385 val lst = ('a' to 'm').toList
       
   386 
       
   387 for (i <- (0 until lst.length)) println(lst(i))
       
   388 
       
   389 // Why not just? Why making your life so complicated?
       
   390 for (c <- lst) println(c)
       
   391 
   397 
   392 
   398 
   393 
   399 
   394 // Aside: concurrency 
   400 // Aside: concurrency 
   395 // scala -Yrepl-class-based -cp scala-parallel-collections_2.13-0.2.0.jar 
   401 // scala -Yrepl-class-based -cp scala-parallel-collections_2.13-0.2.0.jar