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

Vin*_*gio 6 erlang haskell scala yield map

我开始研究Scala编程语言.我对Erlang和Haskell等FP语言有一定的了解,我对for/yield表达式的含义有疑问,比如:

for (arg <- args) yield arg.length
Run Code Online (Sandbox Code Playgroud)

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

map (\a -> a * 2) [1, 2, 3] (in Haskell)
Run Code Online (Sandbox Code Playgroud)

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

ten*_*shi 14

for ... yieldScala的理解是由编译器翻译map,flatMapwithFilter方法调用.for没有yield被翻译成foreach方法调用.您可以在此处找到一些示例和更多信息:

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

和这里

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

  • 因此,flatMap和withFilter相当于concat和select ......它们应该为这个功能模式定义一个标准的命名系统;) (4认同)

Pth*_*ame 6

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

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