我试图使函数具有多态性,但我遇到了以下问题。
以下函数编译:
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
函数内的乘法运算符的问题。有多种隐含的替代方案。我该如何解决这个问题?
答案 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
相乘,而不提供任何与之相关的证据。