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