给出一个简单的序列:
'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
那么这里发生了什么?
答案 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)