Scala map方法语法

Nab*_*egh 21 syntax scala

以下代码来自http://www.scalaclass.com/book/export/html/1来做矩阵点积.

我无法理解大括号之间的语法.

  • 为什么使用大括号,而不是常规方法括号?
  • 这是匿名方法吗?
  • 什么是._1和._2?

谢谢.

type Row    = List[Double]
type Matrix = List[Row]

def dotProd(v1:Row, v2:Row) = 
    v1.zip(v2).map{ t:(Double, Double) => t._1 * t._2 }.reduceLeft(_ + _)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 36

  • 为什么使用大括号,而不是常规方法括号?

当参数是匿名函数时,有些人更喜欢使用花括号.首先,花括号启用模式匹配匿名函数,而括号不支持.在这个特定的例子中,不需要花括号.

这是一个需要花括号的例子(因为case模式匹配):

def dotProd(v1:Row, v2:Row) = 
    v1.zip(v2).map{ case (a, b) => a * b }.reduceLeft(_ + _)
Run Code Online (Sandbox Code Playgroud)

请注意,上述功能以稍微不同的方式完成与问题中相同的功能.

  • t一种匿名方法吗?

不,这是一个参数.就像是v1v2参数一样dotProd,t是传递给匿名函数的参数map.

  • 什么是._1._2

方法论t.该参数t被定义为是一个元组(具体地,Tuple2[Double, Double],这可以写为(Double, Double)),和元组让您提取元组的每个成员与这样的方法:_1,_2,_3,等.

一个Tuple2只有_1_2,当然.请注意,第一个参数_1不是_0因为其他函数语言的影响.

无论如何,该zip方法将convert Row(List[Double])转换为a List[(Double, Double)].该方法map采用将列表元素((Double, Double)元组)转换为其他元素的函数.


om-*_*nom 20

在这个特殊情况下,大括号没有优于普通旧语法的优势,但一般来说,使用大括号的好处是它们允许你在里面编写模式匹配表达式map ...:

所以我可以改写这个

.map{ t:(Double, Double) => t._1 * t._2 }
Run Code Online (Sandbox Code Playgroud)

进入这个

.map{ case(a: Double, b: Double) => a*b }
Run Code Online (Sandbox Code Playgroud)

但这不会编译:

.map( case(a: Double, b: Double) => a*b )
Run Code Online (Sandbox Code Playgroud)

Lee说,._1,._2可以访问N元组的第一,第二,...... N元素.

  • 并且在大括号内不能有多个参数. (2认同)

Mat*_*ell 5

你可以在这个问题中找到一个非常好的答案来解决大括号{}和括号()之间的差异:大括号和括号之间Scala的形式差异是什么,它们何时应该被使用?

对于_1,_2,请参阅scala语言中_2符号的含义.

是的,t:(Double, Double) => t._1 * t._2是一个匿名函数(实际上不是一个方法).Scala中方法和函数之间的区别