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)
上面的代码片段工作正常,但不确定为什么下面的片段会抱怨。我假设如果我将下划线用于参数,我可以讨论该函数
{{1}}
答案 0 :(得分:1)
你遇到了解析器的歧义/限制。 您可以通过添加括号
来解决它[1: 10], [2: 14], [3: 20], [4: 18],
[5: 22], [6: 33], [7: 62], [8: 51],
[9: 89], [10: 27], [11: 13], [12: 56]
答案 1 :(得分:1)
此案例需要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)
。
答案 2 :(得分:0)
如果我没有弄错,你正在寻找函数中部分应用的参数而不是currying。你必须这样做:
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 = $$Lambda$1131/1517266286@1981d861
res1 (2)
res13: Int = 21
答案 3 :(得分:0)
这是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作为一个字符串给出,它抽象出任何与订单函数应用程序无关的属性,我将其解释为您问题的核心。