以下代码来自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 次 |
最近记录: |