匿名参数工作 - 但不是显式参数 - 用于 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)
给出一个简单的序列:
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)