假设我有两种方法
scala> def a(a: Int, b: Int, c: Int) : Int = …
a: (a: Int, b: Int, c: Int)Int
scala> def b(i: Int) : Int = …
b: (i: Int)Int
如何定义方法c
,即两者的组合?
不幸的是,以下代码无法编译:
def c = b(a)
答案 0 :(得分:10)
您可以将方法a
转换为函数,然后使用方法andThen
,如下所示:
def a(a: Int, b: Int, c: Int) : Int = a + b + c
def b(i: Int) : Int = i * 2
val c = (a _).tupled andThen b
c(1, 1, 1)
// 6
请注意,我必须将函数(Int, Int, Int) => Int
转换为tupled version - ((Int, Int, Int)) => Int
- 此处使用andThen
。因此结果函数c
接受Tuple3
作为参数。
您可以使用c
将(Int, Int, Int) => Int
转换为非版本化版本(Function.untupled
):
val untupledC = Function.untupled(c)
untupledC(1, 1, 1)
// 6
功能arity没有untupled
方法> 5。
你也可以使用shapeless
toProduct
/ fromProduct
方法对任何这样的arity:
import shapeless.ops.function._
import shapeless.ops.function._
val c = (a _).toProduct.andThen(b).fromProduct
答案 1 :(得分:7)
Scalaz为更高级别的函数定义Functor
个实例,因此您只需编写
(a _).map(b)