kotlin学习笔记之复合函数f(g(x))

与高阶函数类似,复合函数的参数也是一个函数,不同的是,复合函数通过中缀表达式定义的函数,最终实现同参数及返回值的各种函数之间的复合运算。
举个例子,实现复合函数m(x) = f(g(x))的运算函数

//首先自定义函数f(x)和g(x)
//g(x)
val add5 = {i:Int->i+5}
//f(x)
val multiplyBy2 = {i:Int -> i*2}

//首先在学习复合函数之前,我们实现f(g(x))的运算会使用如下调用
fun main(){
    val result = multiplyBy2(add5(8))   //传入参数值8
    println(result)
}

运行结果

26

下面使用kotlin中复合函数的功能实现该功能:

//解析
//infix 是中缀表达式,所以最终调用addThen的时候不需要用function.addThen的方式调用,这里addThen是自定义扩展函数
//关于这里的几个泛型参数P1、P2、R,以m(x) = f(g(x))为例
//P1为原始参数x,P2为g(x),R为最终返回值m(x)
//关于Function1 这里P1为参数,P2为函数返回值
infix fun Function1.andThen(function: Function1):Function1{
    return fun(p1:P1):R{
        return this.invoke(function.invoke(p1))//这里是关键,定义了最终的函数表达式,这里为f(g(x)
    }
}

//复合函数使用
fun main(){
    //普通函数调用
    val result = multiplyBy2(add5(8))   //传入参数值8
    println(result)
    //复合函数定义
    val fGx = multiplyBy2  andThen add5 //f(g(x)
    println(fGx(8)) //预测结果:(8+5)*2 = 26
}

运行结果

26
26

同理我们要实现m(x) = g(f(x)),因为f(x)与g(x)参数类型及返回值类型相同,我们同样可以使用andThen这个复合函数,此时我们只需调换他们的位置即可

fun main(){
    val gFx = add5  andThen multiplyBy2 //g(f(x)
    println(gFx(8))     //预测结果:8*2+5 = 21
}

//运行结果

21

现在我们实现多参复合函数m(x,y) = f(g(x,y)

//f(x)
val funFx = {i:Int -> i+2}
//g(x,y)
val funGxy = {i:Int,j:Int -> 3*i+100/j}
//复合函数f(g(x,y))
//因为g()有两个参数,所以这里使用Function2
//同样的,P1,P2为对应的参数x,y,P3对应为g(x,y),R对应为f(g(x,y))
infix fun Function1.complexFun(function: Function2):Function2{
    return fun(p1,p2):R{
        return this.invoke(function.invoke(p1, p2))
    }
}

//调用
fun main() {
    val funFxComplexFunGxy = funFx complexFun funGxy
    println(funFxComplexFunGxy(3,5))      //预测运行结果:(3*3 + 100/5)+2 = 31
}

运行结果

31

总结
  1. 复合函数利用中缀表达式(infix)实现类似加减乘除的运算方式形式
  2. 只要函数它的参数及返回值类型符合我们定义的复合函数,都可以直接套用以实现复合调用
  3. 复合函数定义需借助FunctionN来定义函数模式

你可能感兴趣的:(koltin学习笔记)