0

我想以特定方式编写函数以减少代码长度

例如像这样组成一个简单的 add 函数:


    val add3 = (a: Int, b:Int) => (c:Int) => a+b+c

    val composed = (a:Int, b:Int) => n:add3(a, b) => n(1) + n(2) + n(3)

这将非常有用,因此我不必每次都将ab作为参数传递。

有没有办法在 Scala 中做到这一点?

4

2 回答 2

4

我对这些符号有点困惑,比如@Dima ......但是,我经历过这种......试图通过写下直观的方式来处理部分功能......理解它们?那是你在做什么?因此,我将尝试逐步解释您。

首先,我们要明确add3

你给出的这段代码,也许只是我猜想的从头开始理解,不会在 scala 中编译:

val add3 = (a: Int, b:Int)(c:Int) => a+b+c

事实上,我们得到了一个 REPL:

错误:不是合法的形式参数。注意:元组不能直接在方法或函数参数中解构。要么创建一个接受 Tuple1 的参数,要么考虑一个模式匹配匿名函数:`{ case (param1, param1) => ... } val add3 = (a: Int, b:Int)(c:Int) => a+b+c ^

但我可能已经得到你想要建议的想法......

add3是一种方法,如:

def add3Method (a: Int, b:Int)(c:Int) = a+b+c

然后可以部分应用:

val add3 = add3Method _

或者它可以直接是一个函数,如:

val add3 = (a: Int, b:Int) => (c: Int) => a+b+c

无论哪种方式,它都提供 type 的功能(Int, Int) => Int => Int那是你要的吗?

那我们要清楚“ composed

你给出的这段代码,也许只是我猜想的从头开始理解,也不会在 scala 中编译:

val composed = (a:Int, b:Int) => n:add3(a, b) => n(1) + n(2) + n(3)

但我可能……嗯,至少,可能也有你想建议的想法……

(a) 关闭?

你表达它的方式让我觉得就像一个闭包,最终意味着它composed有一个 type (Int, Int) => Int这是你的意思吗?

(b) 一个函数,它需要一种add3?

或者,你只想add3成为任何相同类型的函数,composed我假设是(Int, Int) => Int => Int. 这是你的意思吗?

然后,你有一些方法来定义“ composed

通过映射或中间变量。

闭包,中间变量方式

val composedCI = (a:Int, b:Int) => { val n = add3(a,b); n(1) + n(2) + n(3)}

闭包,映射方式

val composedCM = (a:Int, b:Int) => (1 to 3).map(add3(a,b)).sum

以参数为add3中间变量的方式

val composedTI = (a:Int, b:Int) => (myAdd3asAnArg: (Int, Int) => Int => Int) => { val n = myAdd3asAnArg(a,b); n(1) + n(2) + n(3) }

以 为 参数add3, 映射 方式

val composedTM = (a:Int, b:Int) => (myAdd3asAnArg: (Int, Int) => Int => Int) => (1 to 3).map(myAdd3asAnArg(a,b)).sum

使用“ composed

println(composedCM(4,5))
println(composedCI(4,5))
println(composedTM(4,5)(add3))
println(composedTI(4,5)(add3))

会给

33
33
33
33

希望能帮助到你...

于 2019-04-12T02:44:26.517 回答
3

我也不确定你到底是什么意思,但这是你可以创建一个函数的方法:

  • g:一个采用两个或三个整数的函数,它返回一个整数(这将add3在您的示例中)
  • f:一个采用一个 int 的函数,它返回一个 int(这将n在您的示例中)

并返回:

  • 另一个函数 g(f),采用与 g 相同的输入,但首先应用 f
// type aliases
type TwoOrThreeIntFn = (Int, Int) => Int => Int
type OneIntFn = Int => Int

// create a function that takes two functions and returns their composition
def composition(f: OneIntFn)(g: TwoOrThreeIntFn):TwoOrThreeIntFn = { (a:Int, b:Int) => (c:Int) =>  g(f(a), f(b))(f(c)) }
于 2019-04-12T04:55:51.780 回答