scala reduceLeft的匿名参数有效,但不是显式参数
给出一个简单的序列:scala reduceLeft的匿名参数有效,但不是显式参数,scala,reduce,Scala,Reduce,给出一个简单的序列: scala> val a = Seq(1.0,2.0,3.0) res8: Seq[Double] = List(1.0, 2.0, 3.0) 让我们把它们加起来 scala> a.reduceLeft{_ + _} res6: Double = 6.0 但是,如何明确地使用参数呢?以下是我的尝试: scala> a.reduceLeft{case(b,c) => b+c} 嗯。。不我们有一个类型不匹配: <console>:9
scala> val a = Seq(1.0,2.0,3.0)
res8: Seq[Double] = List(1.0, 2.0, 3.0)
让我们把它们加起来
scala> a.reduceLeft{_ + _}
res6: Double = 6.0
但是,如何明确地使用参数呢?以下是我的尝试:
scala> a.reduceLeft{case(b,c) => b+c}
嗯。。不我们有一个类型不匹配:
<console>:9: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, Double) => ?
a.reduceLeft{case(b,c) => b+c}
^
<console>:9: error: type mismatch;
found : Any
required: String
a.reduceLeft{case(b,c) => b+c
:9:错误:扩展函数缺少参数类型
匿名函数的参数类型必须完全已知。(补充说明8.5)
预期类型为:(?,双)=>?
a、 reduceLeft{case(b,c)=>b+c}
^
:9:错误:类型不匹配;
发现:有吗
必需:字符串
a、 reduceLeft{case(b,c)=>b+c
但即使我明确地添加类型,它也不起作用:
scala> a.reduceLeft{case(b:Double,c:Double) => b+c}
<console>:9: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, Double) => ?
a.reduceLeft{case(b:Double,c:Double) => b+c}
scala>a.reduceLeft{case(b:Double,c:Double)=>b+c}
:9:错误:缺少扩展函数的参数类型
匿名函数的参数类型必须完全已知。(SLS 8.5)
预期类型为:(?,双)=>?
a、 reduceLeft{case(b:Double,c:Double)=>b+c}
这是怎么回事?
reduceLeft
采用的是Function2
而不是带有元组输入参数的Function1
。因此,不需要使用case
进行模式匹配;只需命名两个输入参数即可
不幸的是,错误消息在这里并没有特别的帮助,因为它确实说明了它缺少什么,但并没有以一种真正明确的方式告诉您为什么您所做的不正确
使用a.reduceLeft((a,b)=>a+b)
(大括号也可以。)您在这里写的内容:
a.reduceLeft{case(b,c)=>b+c}
是一个部分函数
让我们看一下reduce left的类型签名:
def reduceLeft[B>:A](操作:(B,A)=>B):B
我们可以看到,它采用一个高阶函数op
,该函数采用两个参数,一个为B
,另一个为a
,并返回aB
在这种情况下,我们将op
作为匿名函数传递,如下所示:
a.reduceLeft((a,b)=>a+b)
谢谢。我很快就会获奖(看起来时钟显示5分钟)你的解释也很有帮助:我奖给了雷克斯克尔,但你的票比我高。