3 |
3 |
4 // - List, Sets, Strings, ... |
4 // - List, Sets, 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 |
|
9 val tmp = 0 |
|
10 val result = !(tmp == 0) |
|
11 val result = if (tmp == 0) true else false |
|
12 |
|
13 // expressions (if (tmp == 0) true else false) |
|
14 // - For-Comprehensions (guards, with/without yield) |
8 // - For-Comprehensions (guards, with/without yield) |
15 // |
|
16 // |
|
17 // - Options |
|
18 // - Higher-Order Functions (short-hand notation) |
|
19 // - maps (behind for-comprehensions) |
|
20 // - Pattern-Matching |
|
21 // - String-Interpolations |
9 // - String-Interpolations |
|
10 // |
|
11 // |
|
12 |
22 |
13 |
23 // Value assignments |
14 // Value assignments |
24 // (their names should be lower case) |
15 // (their names should be lower case) |
25 //==================================== |
16 //==================================== |
26 |
17 |
27 |
18 |
28 val x = 42 |
19 val x = 42 |
29 val y = 3 + 4 |
20 val y = 3 + 4 |
30 val z = x / y |
21 val z = x / y |
31 val x = 70 |
22 val x = 70 |
32 print(z) |
23 println(z) |
33 |
24 |
34 |
25 |
35 // (you cannot reassign values: z = 9 will give an error) |
26 // (you cannot reassign values: z = 9 will give an error) |
36 //var z = 9 |
27 //var z = 9 |
37 //z = 10 |
28 //z = 10 |
|
29 |
38 |
30 |
39 // Hello World |
31 // Hello World |
40 //============= |
32 //============= |
41 |
33 |
42 // an example of a stand-alone Scala file |
34 // an example of a stand-alone Scala file |
243 |
235 |
244 // The general scheme for a function: you have to give a |
236 // The general scheme for a function: you have to give a |
245 // type to each argument and a return type of the function |
237 // type to each argument and a return type of the function |
246 // |
238 // |
247 // def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { |
239 // def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { |
248 // |
240 // .... |
249 // } |
241 // } |
250 |
242 |
251 |
243 |
252 |
244 |
253 // If-Conditionals |
245 // If-Conditionals |
254 //================= |
246 //================= |
255 |
247 |
256 // - Scala does not have a then-keyword |
248 // - Scala used to not have a then-keyword |
257 // - !!both if-else branches need to be present!! |
249 // - !!both if-else branches need to be present!! |
258 |
250 |
259 def fact(n: Int) : Int = |
251 def fact(n: Int) : Int = |
260 if (n == 0) 1 else n * fact(n - 1) |
252 if (n == 0) 1 else n * fact(n - 1) |
|
253 |
|
254 |
|
255 // Scala 3 introduced if-then-else - maybe people |
|
256 // desperately needed it |
|
257 def fact(n: Int) : Int = |
|
258 if n == 0 then 1 else n * fact(n - 1) |
261 |
259 |
262 fact(5) |
260 fact(5) |
263 fact(150) |
261 fact(150) |
264 |
262 |
265 /* boolean operators |
263 /* boolean operators |
375 |
371 |
376 for (n <- (1 to 10).toList) println(n * n) |
372 for (n <- (1 to 10).toList) println(n * n) |
377 |
373 |
378 for (n <- (1 to 10).toList) yield n * n |
374 for (n <- (1 to 10).toList) yield n * n |
379 |
375 |
|
376 |
380 // BTW: a roundabout way of printing out a list, say |
377 // BTW: a roundabout way of printing out a list, say |
381 val lst = ('a' to 'm').toList |
378 val lst = ('a' to 'm').toList |
382 |
379 |
383 for (i <- (0 until lst.length)) println(lst(i)) |
380 for (i <- (0 until lst.length)) println(lst(i)) |
384 |
381 |
385 // Why not just? Why making your life so complicated? |
382 // ...why not just the following? Why making your life |
|
383 // so complicated? |
386 for (c <- lst) println(c) |
384 for (c <- lst) println(c) |
387 |
385 |
388 |
386 |
389 |
387 |
390 // Functions producing multiple outputs |
388 // Functions producing multiple outputs |
429 for (i <- (0 to n)) code |
427 for (i <- (0 to n)) code |
430 val end = System.nanoTime() |
428 val end = System.nanoTime() |
431 (end - start) / 1.0e9 |
429 (end - start) / 1.0e9 |
432 } |
430 } |
433 |
431 |
434 val list = (1 to 1000000).toList |
432 val list = (1L to 10_000_000L).toList |
435 time_needed(10, for (n <- list) yield n + 42) |
433 time_needed(10, for (n <- list) yield n + 42) |
436 time_needed(10, for (n <- list.par) yield n + 42) |
434 time_needed(10, for (n <- list.par) yield n + 42) |
437 |
435 |
438 // ...but par does not make everything faster |
436 // ...but par does not make everything faster |
439 |
437 |
454 // But what the heck....lets try to count to 1 Mio in parallel |
452 // But what the heck....lets try to count to 1 Mio in parallel |
455 import scala.collection.parallel.CollectionConverters._ |
453 import scala.collection.parallel.CollectionConverters._ |
456 |
454 |
457 var cnt = 0 |
455 var cnt = 0 |
458 |
456 |
459 for(i <- (1 to 1000000).par) cnt += 1 |
457 for(i <- (1 to 100_000).par) cnt += 1 |
460 |
458 |
461 println(s"Should be 1 Mio: $cnt") |
459 println(s"Should be 100000: $cnt") |
462 |
460 |
463 |
461 |
464 |
462 |
465 // Or |
463 // Or |
466 // Q: Count how many elements are in the intersections of |
464 // Q: Count how many elements are in the intersections of |
467 // two sets? |
465 // two sets? |
468 // A; IMPROPER WAY (mutable counter) |
466 // A; IMPROPER WAY (mutable counter) |
469 |
467 |
470 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { |
468 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { |
471 var count = 0 |
469 var count = 0 |
472 for (x <- A.par; if (B contains x)) count += 1 |
470 for (x <- A.par; if B contains x) count += 1 |
473 count |
471 count |
474 } |
472 } |
475 |
473 |
476 val A = (0 to 999).toSet |
474 val A = (0 to 999).toSet |
477 val B = (0 to 999 by 4).toSet |
475 val B = (0 to 999 by 4).toSet |
486 A.par.count(x => B contains x) |
484 A.par.count(x => B contains x) |
487 |
485 |
488 count_intersection2(A, B) |
486 count_intersection2(A, B) |
489 |
487 |
490 |
488 |
491 //another bad example |
489 |
492 def test() = { |
490 // String Interpolations |
493 var cnt = 0 |
491 //======================= |
494 for(i <- (1 to 1000000).par) cnt += 1 |
492 |
495 println(cnt) |
493 def cube(n: Int) : Int = n * n * n |
496 } |
494 |
497 |
495 val n = 3 |
498 test() |
496 println("The cube of " + n + " is " + cube(n) + ".") |
499 |
497 |
500 |
498 println(s"The cube of $n is ${cube(n)}.") |
501 |
499 |
502 // Regular Expressions (the built in ones) |
500 // or even |
503 |
501 |
504 val s = """Any so-called "politician" should respect a vote.""" |
502 println(s"The cube of $n is ${n * n * n}.") |
505 print(s) |
503 |
506 |
504 // helpful for debugging purposes |
507 print("""foo""") |
505 // |
508 |
506 // "The most effective debugging tool is still careful |
509 val reg = """\d+""".r |
507 // thought, coupled with judiciously placed print |
510 |
508 // statements." |
511 reg.findAllIn("bbbbaaabbbaaaccc").toList |
509 // — Brian W. Kernighan, in Unix for Beginners (1979) |
512 reg.replaceAllIn("bbbbaaabbbaaaccc", "*") |
510 |
513 reg.replaceAllIn("bbbb0aaa1bbba2aac3cc", "_") |
511 |
514 reg.replaceAllIn("bbbb00aaa11bbba232aac33cc", "_") |
512 |
515 |
513 def gcd_db(a: Int, b: Int) : Int = { |
|
514 println(s"Function called with $a and $b.") |
|
515 if (b == 0) a else gcd_db(b, a % b) |
|
516 } |
|
517 |
|
518 gcd_db(48, 18) |
|
519 |
|
520 // you can also implement your own string interpolations |
|
521 |
|
522 extension (sc: StringContext) { |
|
523 def i(args: Any*): String = s"\t${sc.s(args:_*)}\n" |
|
524 def l(args: Any*): String = s"${sc.s(args:_*)}:\n" |
|
525 } |
|
526 |
|
527 // this allows you to write things like |
|
528 |
|
529 i"add ${3+2}" |
|
530 l"some_fresh_name" |
516 |
531 |
517 // Further Information |
532 // Further Information |
518 //===================== |
533 //===================== |
519 |
534 |
|
535 // We are going to use Scala 3 and the scala-cli repl (easier to use) |
|
536 // |
|
537 // https://scala-cli.virtuslab.org |
|
538 // |
|
539 // |
520 // The Scala homepage and general information is at |
540 // The Scala homepage and general information is at |
521 // |
541 // |
522 // http://www.scala-lang.org |
542 // http://www.scala-lang.org |
523 // http://docs.scala-lang.org |
543 // http://docs.scala-lang.org |
524 // |
544 // |
525 // |
545 // |
526 // It should be fairly easy to install the Scala binary and |
546 // It should be fairly easy to install the scala-cli binary and |
527 // run Scala on the commandline. People also use Scala with |
547 // run Scala on the commandline. People also use Scala with |
528 // Vim and Jedit. I currently settled on VS Code |
548 // Vim and Jedit. I currently settled on Codium |
529 // |
549 // |
530 // https://code.visualstudio.com |
550 // https://code.visualstudio.com |
531 // |
551 // |
532 // There are also plugins for Eclipse and IntelliJ - YMMV. |
552 // There are also plugins for Eclipse and IntelliJ - YMMV. |
533 // Finally there are online editors specifically designed for |
553 // Finally there are online editors specifically designed for |
540 // |
560 // |
541 // |
561 // |
542 // Scala Library Docs |
562 // Scala Library Docs |
543 //==================== |
563 //==================== |
544 // |
564 // |
545 // http://www.scala-lang.org/api/current/ |
565 // https://dotty.epfl.ch/api/index.html |
546 // |
566 // |
547 // Scala Tutorials |
567 // Scala Tutorials |
548 // |
568 // |
549 // http://docs.scala-lang.org/tutorials/ |
569 // http://docs.scala-lang.org/tutorials/ |
550 // |
570 // |
551 // There are also a massive number of Scala tutorials on youtube |
571 // There are also a massive number of Scala tutorials on youtube |
552 // and there are tons of books and free material. Google is your |
572 // and there are tons of books and free material. Google is your |
553 // friend. |
573 // friend. Just make sure you follow newer material about Scala 3. |
554 |
574 |
555 |
575 |