scala - 为什么 Scala 中的柯里化(Currying)需要多个参数列表?

标签 scala

假设我有一个需要部分应用的 2 个参数的函数,我需要将其定义为:

def f(a: Int)(b: Int) = { /* some code */ }

然后我可以将其部分应用为 def fWithA = f(a) _
我的问题是:为了 curry 一个函数,为什么 Scala 要求使用多个参数列表声明参数?最好能够根据需要 curry 任何函数。

最佳答案

实际上,您可以部分应用您想要的任何方法。只需调用该方法并省略参数:

scala> def foo(a: Int, b: Int) = a*b
foo: (a: Int, b: Int)Int

scala> val x = foo(1,_: Int)
x: Int => Int = <function1>

scala> def bar(x: Int, y: Int, z: Int) = x*y+z
bar: (x: Int, y: Int, z: Int)Int

scala> bar(2,_:Int,6)
res0: Int => Int = <function1>

唯一的区别是,您必须告诉编译器缺少参数的类型,否则它无法在重载方法之间做出决定。

另一种方法,如果你有一个真正的函数而不是一个方法,那就是调用 curried关于功能:
scala> val f = {(x:Int, y:Int) => x*y}
f: (Int, Int) => Int = <function2>

scala> f.curried
res2: Int => (Int => Int) = <function1>

您还可以使用 _ 从方法创建函数:
scala> bar _
res6: (Int, Int, Int) => Int = <function3>

然后调用curried对此:
scala> (bar _).curried
res5: Int => (Int => (Int => Int)) = <function1>

关于scala - 为什么 Scala 中的柯里化(Currying)需要多个参数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12660852/

相关文章:

scala - Monad 的左单位定律似乎不适用于 scala 中的列表。那么scala Lists不是monad吗?

scala - 如何在Scala中比较两个对象的相等性?

Scala:有什么方法可以在允许任何参数的情况下强制特征返回某种类型?

scala - 如何在Scala中轻松获取当前操作系统的行分隔符?

java - 如何在使用 maven 的 intelliJ 中向 Java 项目添加 scala 依赖项

java - Java 时间计算 2 个日期之间的月份的错误

java - Kafka Streams JoinWindow 的数据

scala - 具有相同具体类型的 def 的特征

scala - spark csv读取速度很慢,虽然我增加了节点数

scala - 如何从 Scala 中的数组/列表中找到后续数字的差异?