我想以特定方式编写函数以减少代码长度
例如像这样组成一个简单的 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)
这将非常有用,因此我不必每次都将a和b作为参数传递。
有没有办法在 Scala 中做到这一点?
我想以特定方式编写函数以减少代码长度
例如像这样组成一个简单的 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)
这将非常有用,因此我不必每次都将a和b作为参数传递。
有没有办法在 Scala 中做到这一点?
我对这些符号有点困惑,比如@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)
但我可能……嗯,至少,可能也有你想建议的想法……
你表达它的方式让我觉得就像一个闭包,最终意味着它composed
有一个 type (Int, Int) => Int
。这是你的意思吗?
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
希望能帮助到你...
我也不确定你到底是什么意思,但这是你可以创建一个函数的方法:
add3
在您的示例中)n
在您的示例中)并返回:
// 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)) }