【问题标题】:Anonymous parameters working- but not explicit ones - for scala reduceLeft匿名参数工作 - 但不是显式参数 - 用于 scala reduceLeft
【发布时间】:2015-08-19 13:43:41
【问题描述】:

给定一个简单的序列:

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}

那么这里发生了什么?

【问题讨论】:

    标签: scala reduce


    【解决方案1】:

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

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

    使用a.reduceLeft( (a,b) =&gt; a + b )。 (大括号也可以。)

    【讨论】:

    • 谢谢。我会尽快奖励(看起来时钟说 5 分钟)
    【解决方案2】:

    你在这里写的:

    a.reduceLeft{case(b,c) =&gt; b+c}

    是偏函数。

    我们看一下reduce left的类型签名:

    def reduceLeft[B &gt;: A](op: (B, A) =&gt; B): B

    我们可以看到它接受了一个高阶函数op,它接受两个参数,一个是B,另一个是A,并返回一个B

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

    a.reduceLeft((a, b) =&gt; a + b)

    【讨论】:

    • 您的解释也很有帮助:我向 RexKerr 授予了奖项,但对您的投票表示赞同。
    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多