如何编写方法,没有重复的输入参数

时间:2014-02-05 20:43:43

标签: scala

假设我有两种方法

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)

2 个答案:

答案 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)