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

Posted mictoy_朱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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> 这里P1为参数,P2为函数返回值
infix fun<P1,P2,R> Function1<P2,R>.andThen(function: Function1<P1,P2>):Function1<P1,R>
    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<P1,P2,P3,R> Function1<P3,R>.complexFun(function: Function2<P1,P2,P3>):Function2<P1,P2,R>
    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来定义函数模式

以上是关于kotlin学习笔记之复合函数f(g(x))的主要内容,如果未能解决你的问题,请参考以下文章

ZZNUOJ_Java1098:复合函数求值(函数专题)(完整代码)

,有关复合函数与定义域的一个难点

,有关复合函数与定义域的一个难点

Kotlin用高阶函数处理集合数据

复合函数

复合函数连续性