今天开始学习 Scala,我很好奇你是否可以重载一个函数来添加柯里化(Currying),比如:
def add(x: Int, y: Int): Int = x + y
def add(x: Int)(y: Int): Int = x + y
但是这段代码不仅不能编译,而且我听说在 Scala 中重载也不是一个好主意。
有没有一种方法可以重载 add 使其在不进行部分应用的情况下进行柯里化(Currying),这意味着 add(1, 2)
和 add(1)(2)
都可以工作?
最佳答案
问题是那些 add
函数在 JVM 类型删除后无法区分:在执行期间它们都是 (Int, Int)Int
。但是它们在编译期间是不同的,Scala 编译器可以告诉您调用的是哪一个。
这意味着您必须使它们的参数列表不同。为此,您可以添加一个带有 DummyImplicit
参数的隐式参数列表:
def add(x: Int, y: Int)(implicit dummy: DummyImplicit): Int = x + y
def add(x: Int)(y: Int): Int = x + y
这个DummyImplicit
是由Scala 库提供的,它总是有一个隐式值。现在删除后第一个函数的类型是(Int, Int, DummyImplicit)Int
,第二个是(Int, Int)Int
,所以JVM可以区分它们。
现在您可以调用两者:
add(1, 2)
add(1)(2)
关于Scala 重载函数添加柯里化(Currying)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36995312/