2012-04-16 62 views
6

我開始學習Scala編程語言。 我已經FP語言,如二郎和Haskell的一些把握和我有一個關於供/產量表達的意思疑問,如:Scala中的'yield'等價於map函數嗎?

for (arg <- args) yield arg.length 

這將收集與任何輸入參數的長度的陣列。 從我理解,這似乎是在正常FP編程的地圖功能:

map (\a -> a * 2) [1, 2, 3] (in Haskell) 

我知道,Scala庫包含scala.collection.map方法,所以我想知道:有什麼不同或使用任何一種風格的限制,還是完全一樣?

+1

的可能重複(http://stackoverflow.com/questions/1052476/can-someone-explain-scalas-yield) – 2012-04-17 14:12:06

+2

斯卡拉的理解類似於哈斯克爾的「做」符號。 – 2012-04-17 14:13:01

+1

#丹尼爾,但我沒有要求'收益'的含義,但與其他FP表達式的相似之處! – 2012-04-18 15:42:57

回答

14

for ... yield在Scala中的理解被編譯器翻譯爲map,flatMapwithFilter方法調用。 for沒有yield將被翻譯成foreach方法調用。你可以找到一些例子,更多信息進入:[?有人能解釋Scala的收益率]

http://tataryn.net/2011/10/whats-in-a-scala-for-comprehension/

這裏

http://adamwojtuniak.wordpress.com/2010/09/24/scala-for-comprehensions/

+4

因此,flatMap和withFilter相當於concat和select ...他們應該爲這個功能模式真正定義一個標準的命名系統;) – 2012-04-16 22:29:55

6

Scala的for/yield表達式完全等同於Haskell中的list/monad解析,並且具有完全相同的功能,只要您堅持每個for表達式的一種類型。 (我不知道二郎,雖然)。

特別是你的榜樣正好轉換爲[length arg | arg <- args],翻譯斯卡拉方法調用x.f Haskell編程功能應用f x

+1

'yield'是否會產生增量輸出,或者整個列表是否一起去? – 2012-04-16 22:02:48

+1

好例子Ptharien,Haskell一直在提前!關於yield增量輸出,我認爲當你想要並行化代碼時很重要,因爲我記得Scala在2.9中有並行收集和.par方法。 – 2012-04-16 22:28:18

3

for-yield被編譯爲映射 - 它在Scala編程書中。