以下是curried函数的实现:
scala> def multiply(x: Int, y: Int) = x * y
multiply: (x: Int, y: Int)Int
scala> def multiplyCurried = (multiply _).curried
multiplyCurried: Int => (Int => Int)
当我尝试实现multipliCurried时,我收到异常:
<console>:10: error: missing parameter type
multiplyCurried(a => b => a * b)
调用multipleCurried的正确实现是什么?
摘自Wikipedia:Currying是一种将对带有多个参数(或参数元组)的函数的求值转换为对函数序列进行求值的技术,每个函数都具有一个参数(部分应用程序)
def multiply(x: Int, y: Int) = x * y //> multiply: (x: Int, y: Int)Int
def multiplyCurried = (multiply _).curried //> multiplyCurried: => Int => (Int => Int)
def multiplyCurried2(x: Int)(y: Int) = x * y //> multiplyCurried2: (x: Int)(y: Int)Int
def multiplyCurried3(x:Int) = (y:Int) => x * y //> multiplyCurried3: (x: Int)Int => Int
def multiplyCurried4 = multiplyCurried2 _ //> multiplyCurried4: => Int => (Int => Int)
multiply(1, 2) //> res1: Int = 2
multiplyCurried(1)(2) //> res2: Int = 2
multiplyCurried2(1)(2) //> res3: Int = 2
multiplyCurried3(1)(2) //> res4: Int = 2
multiplyCurried2
只是语法糖multiplyCurried3
。
维克多正确地指出的意见,multiplyCurried
而multiplyCurried2
实际上是不一样的。的实现multiplyCurried4
包含将配方变成multiplyCurried2
基本上等于的功能的配方multiplyCurried
。
currying的优点是部分应用程序:
val m = multiplyCurried(1) //> m : Int => Int = <function1>
m(2) //> res5: Int = 2
val m2 = multiplyCurried2(1)_ //> m : Int => Int = <function1>
m2(2)
//> res6: Int = 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句