cs320 - scala seminar working with scala collections · / 50 summary • scala offers useful...

50
/ 50 CS320 - Scala Seminar Working with Scala Collections Jaemin Hong [email protected] September 12, 2018 1

Upload: others

Post on 22-May-2020

10 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

CS320 - Scala Seminar

Working with Scala Collections

Jaemin [email protected]

September 12, 2018

!1

Page 2: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

Why Functional?• Good to reason and to verify programs.

• Easy to parallelize.

• Make high-level abstraction available.

• Can model and treat complex structures.

!2

Immutability

Higher-order functions

ADT & Pattern Matching

Page 3: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

Reviewtrait List

case object Nil extends List

case class Cons(head: Int, tail: List) extends List

!3

Page 4: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def inc1(l: List): List =

list_map(l, _ + 1)

def square(l: List): List =

list_map(l, h => h * h)

!4

Review

Page 5: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def odd(l: List): List =

list_filter(l, _ % 2 != 0)

def positive(l: List): List =

list_filter(l, _ > 0)

!5

Review

Page 6: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def sum(l: List): Int =

list_foldRight(l, 0, _ + _)

def product(l: List): Int =

list_foldRight(l, 1, _ * _)

!6

Review

Page 7: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def sum(l: List): Int =

list_foldLeft(l, 0, _ + _)

def product(l: List): Int =

list_foldLeft(l, 1, _ * _)

!7

Review

Page 8: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

Nil

Cons(0, Nil)

Cons(0, Cons(1, Nil))

List(0, 1, 2)

!8

List in Scala Standard LibraryNil

0 :: Nil

0 :: 1 :: Nil

List(0, 1, 2)

Page 9: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

List(0, 1, 2) match {

case Nil => "foo"

case Cons(h, t) => “bar"

}

!9

List in Scala Standard LibraryList(0, 1, 2) match {

case Nil => "foo"

case h :: t => "bar"

}

Page 10: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

List(): List

List(0): List

List(0, 1): List

List(0, 1, 2): List

!10

List in Scala Standard LibraryList(): List[Nothing]

List(true): List[Boolean]

List("a", "b"): List[String]

List(0.0, 0.1, 0.2): List[Double]

Page 11: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def inc1(l: List): List =

l match {

case Nil => Nil

case Cons(h, t) =>

Cons(h + 1, t)

}

!11

List in Scala Standard Librarydef inc1(l: List[Int]): List[Int] =

l match {

case Nil => Nil

case h :: t =>

(h + 1) :: t

}

Page 12: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_map(

List(1, 2, 3),

_ + 1

)

!12

List in Scala Standard LibraryList(1, 2, 3).map(_ + 1)

List(1, 2, 3).map(_ == 1)

Page 13: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_map(

List(1, 2, 3),

_

)

!13

List in Scala Standard LibraryList(1, 2, 3).map(println(_))

List(1, 2, 3).foreach(

println(_)

)

Page 14: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_map(

List(1, 2, 3),

_

)

!14

List in Scala Standard LibraryList(1, 2, 3).flatMap(

List(_)

)

List(1, 2, 3).flatMap(

1 to _

)

Page 15: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_filter(

List(1, 2, 3),

_ % 2 == 1

)

!15

List in Scala Standard LibraryList(1, 2, 3)

.filter(_ % 2 != 0)

List("", "a", "ab")

.filter(_.length == 1)

Page 16: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_foldRight(

List(1, 2, 3),

0,

_ + _

)

!16

List in Scala Standard LibraryList(1, 2, 3)

.foldRight(0)(_ + _)

(List(1, 2, 3) :\ 0)(_ + _)

Page 17: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_foldRight_list(

List(1, 2, 3),

List(4),

Cons(_, _)

)

!17

List in Scala Standard LibraryList(1, 2, 3)

.foldRight(List(4))(_ :: _)

(List(1, 2, 3) :\ List(4))

(_ :: _)

Page 18: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_foldLeft(

List(1, 2, 3),

1,

_ * _

)

!18

List in Scala Standard LibraryList(1, 2, 3)

.foldLeft(1)(_ * _)

(1 /: List(1, 2, 3))(_ * _)

Page 19: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_foldLeft_list(

List(1, 2, 3),

List(),

(t, h) => Cons(h, t)

)

!19

List in Scala Standard LibraryList(1, 2, 3)

.foldLeft

(List[Int]())

((t, h) => h :: t)

(List[Int]() /: List(1, 2, 3))

((t, h) => h :: t)

Page 20: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

addBack(List(1, 2, 3), 4)

append(

List(1, 2, 3),

List(4, 5, 6)

)

!20

List in Scala Standard LibraryList(1, 2, 3) :+ 4

List(1, 2, 3) ++ List(4, 5, 6)

Page 21: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

length(List(1, 2, 3))

reverse(List(1, 2, 3))

!21

List in Scala Standard LibraryList(1, 2, 3).length

List(1, 2, 3).reverse

Page 22: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

www.scala-lang.org/api/current/scala/collection/immutable/List.html

!22

List in Scala Standard Library

Page 23: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

trait Option

case object None extends Option

case class Some(n: Int) extends Option

!23

Review

Page 24: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def list_getOrElse(l: List, i: Int, default: Int): Int =

option_getOrElse(

list_getOption(l, i),

default

)

!24

Review

Page 25: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def getSquare(l: List, i: Int): Option =

option_map(

list_getOption(l, i),

n => n * n

)

!25

Review

Page 26: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def getAndDiv100(l: List, i: Int): Option =

option_flatMap(

list_getOption(l, i),

div100Safe

)

!26

Review

Page 27: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

None

Some(0)

Some(1)

!27

Option in Scala Standard LibraryNone

Some(0)

Some(1)

Page 28: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

Some(0) match {

case None => "foo"

case Some(n) => "bar"

}

!28

Option in Scala Standard LibrarySome(0) match {

case None => "foo"

case Some(n) => "bar"

}

Page 29: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

None: Option

Some(0): Option

Some(1): Option

Some(2): Option

!29

Option in Scala Standard LibraryNone: Option[Nothing]

Some(true): Option[Boolean]

Some("a"): Option[String]

Some(1.0): Option[Double]

Page 30: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

option_getOrElse(

Some(0),

1

)

!30

Option in Scala Standard LibrarySome(0).getOrElse(1)

Some("foo").getOrElse("bar")

Page 31: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

option_map(

Some(0),

n => n * n

)

!31

Option in Scala Standard LibrarySome(0).map(n => n * n)

Some(0).map(_.toString)

Page 32: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

option_flatMap(

Some(0),

div100Safe

)

!32

Option in Scala Standard LibrarySome(0).flatMap(div100Safe)

Page 33: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_get(List(1, 2, 3), 0)

list_getOption(

List(1, 2, 3), 0)

lift(

list_getOption(

List(1, 2, 3), _))(0)

!33

List in Scala Standard LibraryList(1, 2, 3)(0)

List(1, 2, 3).lift(0)

Page 34: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

list_filter(

list_map(

List(0, 1, 2),

n => option_getOrElse(

div100Safe(n), 99)

), _ != 99)

!34

List in Scala Standard LibraryList(0, 1, 2).flatMap(

div100Safe

)

Page 35: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

www.scala-lang.org/api/current/scala/collection/immutable/Option.html

!35

Option in Scala Standard Library

Page 36: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3))

println(n)

List(1, 2, 3).foreach(n =>

println(n))

!36

For Loop in Scala

Page 37: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3);

m <- 1 to n)

println(m)

List(1, 2, 3).foreach(n =>

(1 to n).foreach(m =>

println(m)))

!37

For Loop in Scala

Page 38: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3) if n % 2 != 0)

println(n)

List(1, 2, 3).filter(n => n % 2 != 0).foreach(n =>

println(n))

!38

For Loop in Scala

Page 39: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3) if n % 2 != 0;

m <- 1 to n)

println(m)

List(1, 2, 3).filter(n => n % 2 != 0).foreach(n =>

(1 to n).foreach(m =>

println(m)))

!39

For Loop in Scala

Page 40: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3))

yield n * n

List(1, 2, 3).map(n =>

n * n)

!40

For Loop in Scala

Page 41: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3);

m <- 1 to n)

yield m * m

List(1, 2, 3).flatMap(n =>

(1 to n).map(m =>

m * m))

!41

For Loop in Scala

Page 42: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (n <- List(1, 2, 3) if n % 2 != 0;

m <- 1 to n)

yield m * m

List(1, 2, 3).filter(n => n % 2 != 0).flatMap(n =>

(1 to n).map(m =>

m * m))

!42

For Loop in Scala

Page 43: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def f(x: Int): Option[Int] = ...

def g(x0: Int, x1: Int, x2: Int, x3: Int): Int = ...

Apply x to four integers. Then, if it succeeds, apply g.

!43

For Loop in Scala

Page 44: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

(f(n0), f(n1), f(n2), f(n3)) match {

case (Some(m0), Some(m1), Some(m2), Some(m3)) =>

Some(g(m0, m1, m2, m3))

case _ =>

None

}

!44

For Loop in Scala

Page 45: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

f(n0) match {

case Some(m0) => f(n1) match {

case Some(m1) => f(n2) match {

case Some(m2) => f(n3) match {

case Some(m3) => Some(g(m0, m1, m2, m3))

case None => None } case None => None }

case None => None } case _ => None }

!45

For Loop in Scala

Page 46: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

f(n0).flatMap(m0 =>

f(n1).flatMap(m1 =>

f(n2).flatMap(m2 =>

f(n3).map(m3 => g(m0, m1, m2, m3)))))

!46

For Loop in Scala

Page 47: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

for (

m0 <- f(n0);

m1 <- f(n1);

m2 <- f(n2);

m3 <- f(n3)

) yield m0 * m1 * m2 * m3

!47

For Loop in Scala

Page 48: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

$ scala Chatbot.scala "when OLEV come to E11 and when downtown bus come to time world??"

No more OLEV at E11 today.

Weolpyeong Shuttle arrives at Galleria at 17:25.

$ scala Chatbot.scala "Electric car arrive at cafeteria at what time?"

OLEV arrives at Cafeteria at 10:15, 10:25, 10:45...

$ scala Chatbot.scala "When campus shuttle go to gungdong?"

Please say stops of OLEV properly: Cafeteria, Sports Complex, E11, Medical Science Center, KAIST Clinic, South Gate, Duck Pond, Main Hall

!48

Example: KAIST Bus Chatbot

Page 49: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

def query(msg: String, day: Int, hour: Int, min: Int): String

def queryBus(msg: String, day: Int, hour: Int, min: Int, bus: Bus): Option[String]

def queryStop(msg: String, day: Int, hour: Int, min: Int, bus: Bus, stop: Stop): Option[String]

!49

Example: KAIST Bus Chatbot

Page 50: CS320 - Scala Seminar Working with Scala Collections · / 50 Summary • Scala offers useful collection library, which includes List and Option with many helper methods. • for

/ 50

Summary• Scala offers useful collection library, which includes List and Option with many

helper methods.

• for statement of Scala is transformed into code using foreach, filter, map, flatMap at the compile-time.

• for is functional - completely immutable - and can yield value

• We can implement real-world applications in functional style.

• See you again after the midterm!

!50