7

我开始学习 Scala 编程语言。我对 Erlang 和 Haskell 等 FP 语言有所了解,但我对 for/yield 表达式的含义有疑问,例如:

for (arg <- args) yield arg.length

这将收集具有任何输入参数长度的数组。据我了解,这似乎是普通 FP 编程中的 map 函数:

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

我知道 Scala 库包含 scala.collection.map 方法,所以我想知道:使用这两种风格是否有任何区别或限制,或者它们完全相同?

4

3 回答 3

15

for ... yieldScala 中的理解由编译器翻译为map,flatMapwithFilter方法调用。forwithoutyield将被转换为foreach方法调用。您可以在此处找到一些示例和更多信息:

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

和这里

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

于 2012-04-16T22:03:00.563 回答
6

Scala 的for/yield表达式完全等同于 Haskell 中的列表/单子推导式,并且具有完全相同的功能,只要您坚持每个for表达式的一种类型。(不过,我不了解 Erlang。)

特别是,您的示例完全转换为[length arg | arg <- args],将 Scala 方法调用x.f转换为 Haskell 函数应用程序f x

于 2012-04-16T21:56:35.133 回答
3

for-yield 被编译成映射 - 它在 Programming in Scala 书中。

于 2012-04-16T22:02:00.017 回答