Scala currying有三个参数函数

时间:2017-05-21 16:33:49

标签: scala currying

    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}}

4 个答案:

答案 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作为一个字符串给出,它抽象出任何与订单函数应用程序无关的属性,我将其解释为您问题的核心。