code

2016年11月1日 星期二

Scala筆記 20 - For...yield

如果要對一個list做nested loop能做到的是,通常我們需要寫filter, map和flatten:

def sumIsPrime(list:List[Int]) =
  list.flatMap( x => (list map ( y => (x,y) ))) filter{ case (x:Int,y:Int) => (x<y && isPrime(x+y)) }


Scala更抽象化了這個邏輯,模仿了imperative language的for loop,以下的例子可以改寫成for statment:

list filter( x => x>3) map (x => x*x)

for (elem <- list if elem > 3 ) yield elem*elem

在可讀性上是有改進了。

for 的參數包括了 generator-filter sequence:

  • generator: pattern <- collection
  • predicates: if (...)

for的參數如果用{ } 匡起來,則可以寫成multi-line generators/filter,(否則需要 ; 隔開generators):

for (elem <- list 
     if elem > 3 ) yield elem*elem


或是這個nested loop:




沒有留言:

張貼留言