Scala 柯里化三参数函数

Scala currying with three argument function

    scala> def sum(a:Int)(b:Int) = a+b;
    sum: (a: Int)(b: Int)Int

    scala> var psum = sum(5)_
    psum: Int => Int = $$Lambda35/814753967@724c5cbe

    scala> psum(23)
    res0: Int = 28

上面的代码片段工作正常但不确定为什么下面的代码片段 complains.I 假设如果我在参数中加上下划线,我可以柯里化该函数

    scala> def sum(a:Int)(b:Int)(c:Int) = a + b + c;
    sum: (a: Int)(b: Int)(c: Int)Int

    scala> var psum = sum(5)_(23) 

您命中了解析器的 ambiguity/limitation。 您可以通过添加括号

来解决它
val psum = (sum(5)_)(23) 

这个案例你需要的是val psum = sum(5)(_: Int)(23)(sum(3)_)(2) 计算如下:sum(3)_(b: Int) => (c: Int) => sum(3)(b)(c) 相同,将其应用于 2 得到 (c: Int) => sum(3)(2)(c).

如果我没记错的话,您正在寻找函数中部分应用的参数,而不是柯里化。你必须这样做:

def sum(a:Int,b:Int,c:Int) = a * b + c
  sum: (a: Int, b: Int, c: Int)Int
sum(10, _:Int, 1)
  res1: Int => Int = $$Lambda31/1517266286@1981d861
res1 (2)
  res13: Int = 21

这是 Scala 语法的限制。您可以像这样实现相同的语义:

scala> def sum(a:Int)(b:Int)(c:Int) = s"a: $a, b: $b, c: $c"
sum: (a: Int)(b: Int)(c: Int)String

scala> def flip[A,B,C](f:A => B => C): B => A => C  = b => a => f(a)(b)
flip: [A, B, C](f: A => (B => C))B => (A => C)

scala> flip(sum(5))(23)
res1: Int => String = <function1>

scala> res1(50)
res2: String = a: 5, b: 50, c: 23

基本上,flip 切换二进制函数的顺序,因此我们可以使用它使中间参数 b 成为 flip(sum(5)) 的最后一个参数。

(*) 我冒昧地让 sum 返回一个字符串,它抽象出与订单函数应用程序无关的任何属性,我将其解释为您问题的核心。