在进一步的函数组合中使用组合函数时出错

Error in using composed function in further function composition

我无法理解为什么我无法使用组合函数并组合新函数。例如:我有两个函数 fg,我从中创建了一个组合函数 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