code

2016年11月8日 星期二

Scala筆記 22 - 說說For

for在Scala裡面有點難掌握,有必要詳細的講一下:


1. 最簡單的form


compiler會翻譯成 (e1要有implement map method才行):

這沒什麼疑問


2.  一個generator + 一個filter


compiler會翻譯成 (e1要有implement withFilter method才行):


withFilter類似filter的功用,但是是lazy evaluation,換句話說不會即刻回傳filtered collection,而是先註記這個collection即將要被filter,如果collection去做map或是flatmap等動作時,就會先做此預告的filtering。

注意if f後面有一個 ; s,所以這個filter f是有順序性的,不是永遠擺在最後,而是看你要在哪一個loop level做filtering。

3. 2 generators

compiler會翻譯成 (e1要有implement flatMap, e2 要impelemt map method才行):


每個e1的element x 被map成|e2|個collection,然後flatten。
所以相當於nested loop,outerloop執行 |e1| 次,inner loop執行 |e2|次(假設s沒有其他的generator)


以上三者可以當成基礎元件來解讀一個Scala for "loop"。


4. pattern matching in for


這是我在Anagrams的作業中有用到的技巧,不過我還是第一次看到等號的expression在generators中出現?!


generator中的pattern matching其實是對 collection的filter:




不過在generators中可以寫入assignment就有點奇怪了,找更多資料再來update這篇。


沒有留言:

張貼留言