我开始研究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方法,所以我想知道:使用这两种风格有什么区别或限制,或者它们是完全相同的吗?
答案 0 :(得分:14)
for ... yield
理解由编译器转换为map
,flatMap
和withFilter
方法调用。没有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编程书中。