以下代码来自http://www.scalaclass.com/book/export/html/1来做矩阵点积.
我无法理解大括号之间的语法.
谢谢.
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一种匿名方法吗?不,这是一个参数.就像是v1和v2参数一样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元素.
你可以在这个问题中找到一个非常好的答案来解决大括号{}和括号()之间的差异:大括号和括号之间Scala的形式差异是什么,它们何时应该被使用?
对于_1,_2,请参阅scala语言中_2符号的含义.
是的,t:(Double, Double) => t._1 * t._2是一个匿名函数(实际上不是一个方法).Scala中方法和函数之间的区别
| 归档时间: |
|
| 查看次数: |
26370 次 |
| 最近记录: |