在进一步的函数组合中使用组合函数时出错
Error in using composed function in further function composition
我无法理解为什么我无法使用组合函数并组合新函数。例如:我有两个函数 f
和 g
,我从中创建了一个组合函数 composed1
。我尝试将 composed 与第四个函数 lastOne
结合使用,但失败了。
我想制作两个复合函数,对于第二个复合函数,有没有办法重用第一个复合函数?
scala> def f(x: Int)(y: Int) = {
| x + y
| }
f: (x: Int)(y: Int)Int
scala> def g(a: Int)(b: Int) = {
| a + b
| }
g: (a: Int)(b: Int)Int
scala> def composed1(a: Int, b: Int) = {
| f(a) _ andThen g(b)
| }
composed1: (a: Int, b: Int)Int => Int
scala> composed1(2, 2)(5)
res1: Int = 9
scala> def lastOne(l: Int)(x: Int) = {
| l + x
| }
lastOne: (l: Int)(x: Int)Int
scala> def composed2(a: Int, b: Int, c: Int) = {
| composed1(a, b) _ andThen lastOne(c)
| }
<console>:14: error: _ must follow method; cannot follow Int => Int
composed1(a, b) _ andThen lastOne(c)
^
<console>:14: error: missing argument list for method lastOne
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `lastOne _` or `lastOne(_)(_)` instead of `lastOne`.
composed1(a, b) _ andThen lastOne(c)
当我将所有这些一起使用时,效果很好
scala> def test(x: Int, y: Int, z: Int) = {
| f(x) _ andThen g(y) _ andThen lastOne(z)
| }
test: (x: Int, y: Int, z: Int)Int => Int
scala> test(2, 2, 4)(5)
res9: Int = 13
f()()
和 g()()
,如您所定义的,是方法。 Methods are not functions but methods can be promoted to functions via "”。一种方法是使用下划线代替传递的参数。
andThen()
是 Function
trait 上的一种方法,它接受一个函数作为参数,returns 接受一个新函数。看起来你也可以使用一个方法作为传递的参数,但它正在悄悄地提升到 Function
状态。
所以 composed1()
看起来像一个方法,但它实际上是一个 Function
,因为那是 andThen()
returns,你不能应用下划线 eta 扩展到 Function
。它仅适用于方法。
作为实验,将 f()()
变成做同样事情的 Function
...
def f :Int => Int => Int = (x: Int) => (y: Int) => x + y
...现在 composed1()
无法编译。
那么,既然我们知道 composed1()
是一个 Function
,那么我们如何从 composed2()
中得到我们想要的呢?简单的。跳过下划线。
def composed2(a: Int, b: Int, c: Int) =
composed1(a, b) andThen lastOne(c)
composed2(2, 2, 4)(5) //res0: Int = 13
我无法理解为什么我无法使用组合函数并组合新函数。例如:我有两个函数 f
和 g
,我从中创建了一个组合函数 composed1
。我尝试将 composed 与第四个函数 lastOne
结合使用,但失败了。
我想制作两个复合函数,对于第二个复合函数,有没有办法重用第一个复合函数?
scala> def f(x: Int)(y: Int) = {
| x + y
| }
f: (x: Int)(y: Int)Int
scala> def g(a: Int)(b: Int) = {
| a + b
| }
g: (a: Int)(b: Int)Int
scala> def composed1(a: Int, b: Int) = {
| f(a) _ andThen g(b)
| }
composed1: (a: Int, b: Int)Int => Int
scala> composed1(2, 2)(5)
res1: Int = 9
scala> def lastOne(l: Int)(x: Int) = {
| l + x
| }
lastOne: (l: Int)(x: Int)Int
scala> def composed2(a: Int, b: Int, c: Int) = {
| composed1(a, b) _ andThen lastOne(c)
| }
<console>:14: error: _ must follow method; cannot follow Int => Int
composed1(a, b) _ andThen lastOne(c)
^
<console>:14: error: missing argument list for method lastOne
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `lastOne _` or `lastOne(_)(_)` instead of `lastOne`.
composed1(a, b) _ andThen lastOne(c)
当我将所有这些一起使用时,效果很好
scala> def test(x: Int, y: Int, z: Int) = {
| f(x) _ andThen g(y) _ andThen lastOne(z)
| }
test: (x: Int, y: Int, z: Int)Int => Int
scala> test(2, 2, 4)(5)
res9: Int = 13
f()()
和 g()()
,如您所定义的,是方法。 Methods are not functions but methods can be promoted to functions via "
andThen()
是 Function
trait 上的一种方法,它接受一个函数作为参数,returns 接受一个新函数。看起来你也可以使用一个方法作为传递的参数,但它正在悄悄地提升到 Function
状态。
所以 composed1()
看起来像一个方法,但它实际上是一个 Function
,因为那是 andThen()
returns,你不能应用下划线 eta 扩展到 Function
。它仅适用于方法。
作为实验,将 f()()
变成做同样事情的 Function
...
def f :Int => Int => Int = (x: Int) => (y: Int) => x + y
...现在 composed1()
无法编译。
那么,既然我们知道 composed1()
是一个 Function
,那么我们如何从 composed2()
中得到我们想要的呢?简单的。跳过下划线。
def composed2(a: Int, b: Int, c: Int) =
composed1(a, b) andThen lastOne(c)
composed2(2, 2, 4)(5) //res0: Int = 13