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

Yan*_*san 7 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
Run Code Online (Sandbox Code Playgroud)

如何定义一个方法c,即两者的组合?不幸的是,以下代码无法编译:

def c = b(a)
Run Code Online (Sandbox Code Playgroud)

sen*_*nia 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
Run Code Online (Sandbox Code Playgroud)

请注意,我必须将函数转换(Int, Int, Int) => Int为tupled版本((Int, Int, Int)) => Int- 这里使用andThen.所以结果函数c接受Tuple3为参数.

您可以使用以下命令转换c为untupled version((Int, Int, Int) => Int)Function.untupled:

val untupledC = Function.untupled(c)

untupledC(1, 1, 1)
// 6
Run Code Online (Sandbox Code Playgroud)

无形的

untupled函数arity> 5 没有方法.

你也可以使用/ 方法对任何这样的arity:shapeless toProductfromProduct

import shapeless.ops.function._
import shapeless.ops.function._

val c = (a _).toProduct.andThen(b).fromProduct
Run Code Online (Sandbox Code Playgroud)


Hug*_*ugh 7

Scalaz Functor为高级函数定义了实例,因此您可以编写

(a _).map(b)
Run Code Online (Sandbox Code Playgroud)