对于scala reduceLeft,匿名参数工作 - 但不是明确的参数

时间:2015-06-04 19:25:55

标签: scala reduce

给出一个简单的序列:

'me@somewhere.com,you@somewhereelse.com,him@somewhere.com'

让我们把它们加起来!

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

那么这里发生了什么?

2 个答案:

答案 0 :(得分:7)

reduceLeft使用带有元组输入参数的Function2而不是Function1。因此,您不需要使用case来匹配模式;你只需要命名你的两个输入参数。

不幸的是,错误消息在这里并不是特别有用,因为它确实说明了它缺少的内容,但并没有真正清楚地告诉你为什么你所做的事情是不对的。

使用a.reduceLeft( (a,b) => a + b )。 (大括号也很好。)

答案 1 :(得分:2)

你在这里写的:

a.reduceLeft{case(b,c) => b+c}

是部分功能。

让我们来看看reduce left的类型签名:

def reduceLeft[B >: A](op: (B, A) => B): B

我们可以看到它需要一个更高阶函数op,它接受​​两个参数,一个是B类型,另一个是类型A,并返回B

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

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