Scala 重载函数添加柯里化(Currying)?

标签 scala currying

今天开始学习 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/

相关文章:

python - 如何使用 Jython 将 Python 集成到 Scala 中

javascript - 有人可以向我解释这个 JavaScript 函数的流程吗? (关闭概念)

haskell - 仍然混淆带有多个箭头的类型签名如何工作

javascript - Node 柯里化(Currying)函数,并为其分配了惰性值

scala - Play Framework : How can I use a given certifcate for an HTTP WS. url 调用?

java - Google PubSub Java (Scala) 客户端收到过多的重发消息

macos - sbt-native-packager用于Mac OS X上的Docker

scala - 存在类型的最佳用例

python - 为什么 functools.partial 不返回一个真正的函数(以及如何创建一个真正的函数)?

javascript - 函数式编程: Calling a Curried Function