函数式中的 currying
currying 是函数式语言中经常遇到的一个概念,翻译成 柯里化,不是库里化。
currying 指的是将接收多个参数的函数变换成接收一个单一参数,并且返回接收余下的参数而且返回结果的新函数的技术。
说起来比较拗口,直接看下面的代码。
def add(x: Int, y: Int): Int = x + y //call add add(1, 2) add(3, 4)
但是如果我们使用 currying 的写法,那么可以将两个参数分开,接收第一个参数(x),然后返回一个函数,这个函数以第二个参数(y)为参数,返回结果:
def add(x:Int) => (y: Int) = x + y
然后我们就可以这样调用 add 了。
add(1)(2) add(3)(4)
scala 对于这种写法提供了语法糖,add 的 currying 写法我们可以更简单地写为:
def add(x: Int)(y: Int): Int = x + y
尝试将一个函数(这里指f)写成 curry 方式:
def curry[A, B, C](f: (A, B) => C): A => (B => C) = a => b => f(a, b)
这里的 currying 函数,它接收两个参数,分别为 A 类型和 B 类型,然后返回一个 C 类型的结果。那么我们可以通过得到一个偏函数将其转化为 curry 的方式,即 A => (B => C)。具体流程是,用第一个参数 a ,得到一个函数,这个函数使用 b 作为参数,然后得到结果。这里中间的这个函数,是一个偏函数。
同样我们也可以写一个 uncurry 的方法(即将 currying 的函数f转化成非 currying 的):
def uncurry[A, B, C](f: A => B => C): (A, B) =>&
