从多态局部函数内的多态封闭函数中获取参数

时间:2015-05-24 23:04:07

标签: scala

我试图使函数具有多态性,但我遇到了以下问题。

以下函数编译:

libraryDependencies += "org.spire-math" %% "spire" % "0.10.1"

import spire.math._
import spire.implicits._

  def foo(a : Int, b : Int) : Int = {

    def bar(c : Int, d :Int) : Int = {
      c * b
    }
    a * bar(1,2)
  }

这里的基本思想是本地函数之一,并且能够从本地函数中的封闭函数引用参数。但是,如果我尝试使这个函数具有多态性,如下所示:

import spire.math._
import spire.implicits._

  def foo[A:Numeric] (a : A, b : A) : A = {

    def bar[A:Numeric](c : A, d :A) : A = {
      c * b
    }
    a * bar(1,2)
  }
<console>:22: error: overloaded method value * with alternatives:
  (rhs: Double)(implicit ev1: spire.algebra.Field[A(in method bar)])A(in method bar) <and>
  (rhs: Int)(implicit ev1: spire.algebra.Ring[A(in method bar)])A(in method bar) <and>
  (rhs: A(in method bar))A(in method bar)
 cannot be applied to (A(in method foo))
             c * b
               ^

我遇到了编译器无法解析bar函数内的乘法运算符的问题。有多种隐含的替代方案。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

bar不需要通用:

import spire.math._
import spire.implicits._

def foo[A: Numeric] (a: A, b: A) : A = {
  def bar(c: A, d: A) : A = {
    c * b
  }
  a * bar(1, 2)
}

但是,您只会收到错误,因为您已经写了c * b(而bar的第二个参数名为d),这意味着您和&# #39;重新尝试将外部A和内部通用A相乘,而不提供任何与之相关的证据。