最近在接触相关js代码,发现了一个柯里化的编程技巧,之前写kotlin代码时也很少真正用上函数式编程的思维去写出相关的函数式编程思想的代码,因此看到这个柯里化技巧不由感慨哈哈哈哈
柯里化(Currying)是函数式编程中常见的技巧。它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c),柯里化不会调用函数。它只是对函数进行转换。
作为函数为一等公民的Kotlin,按照柯里化的方式进行函数调用的封装不但更加简洁也更加方便拓展,下面我们来认识一下这个技巧
从一个例子出发
这是一个两数之和的例子:
fun sum(a:Int,b:Int):Int{
return a+b
}
函数可以直接通过sum(a,b)的方式进行调用,如果我们想要实现sum(a)(b)这种柯里化的形式,那么我们可以通过添加封装函数做到
fun curry(func: (a:Int,b:Int)->Int):(a:Int)->(b:Int)->Int{
return fun(a:Int):(b:Int)->Int{
return fun (b:Int):Int{
return func(a,b)
}
}
}
我们可以通过返回一个匿名的嵌套函数的形式,达到我们的目的,调用就能够满足我们想要的方式进行
fun main() {
val curried = curry(::sum)
println(curried(1)(2))
}
当然,如果我们不想写死函数的入参为Int类型,我们也可以通过泛型的方式进行改写
fun <P1, P2, R> curry(func: (P1, P2) -> R): (P1) -> (P2) -> R {
return { p1: P1 ->
{ p2: P2 ->
func(p1, p2)
}
}
}
小记
柯里化让我们能够更容易地获取部分应用函数,比如我们可以封装部分参数的形式达到更加简洁的函数调用,这个更加符合函数式编程思想