匿名参数工作 - 但不是显式参数 - 用于 scala reduceLeft

Anonymous parameters working- but not explicit ones - for scala reduceLeft

给出一个简单的序列:

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

但即使我明确地添加了类型,它也不起作用:

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}

那么这是怎么回事?

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

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

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

您在这里写的内容:

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

是偏函数。

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

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

我们可以看到它有一个高阶函数op,它有两个参数,一个是B类型,另一个是A类型,returns一个B

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

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