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
,并返回a
B

在这种情况下,我们将
op
作为匿名函数传递,如下所示:


a.reduceLeft((a,b)=>a+b)

谢谢。我很快就会获奖(看起来时钟显示5分钟)你的解释也很有帮助:我奖给了雷克斯克尔,但你的票比我高。