Scala中的'yield'是否等同于map函数?

时间:2012-04-16 21:45:28

标签: scala haskell map erlang yield

我开始研究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方法,所以我想知道:使用这两种风格有什么区别或限制,或者它们是完全相同的吗?

3 个答案:

答案 0 :(得分:14)

Scala中的

for ... yield理解由编译器转换为mapflatMapwithFilter方法调用。没有for的{​​{1}}会被转换为yield方法调用。您可以在此处找到一些示例和更多信息:

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

在这里

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

答案 1 :(得分:6)

Scala的for / yield表达式完全等同于Haskell中的list / monad comprehension,并具有完全相同的功能,只要您坚持每for个表达式使用一种类型。 (不过我不知道Erlang。)

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

答案 2 :(得分:3)

for-yield被编译成地图 - 它出现在Scala编程书中。