【31】kotlin 函數複合

code

package com.yzdzy.kotlin.chapter5.componse

//求f(g(x))
// 如果m(x)=f(g(x))
//那麼 m就是fgx的複合

val add5 = { i: Int -> i + 5 }
val multiplyBy2 = { i: Int -> i * 2 }

//複合函數
infix fun <P1, P2, R> Function1<P1, P2>.andThen(function: Function1<P2, R>): Function1<P1, R> {
    return fun(p1: P1): R {
        return function.invoke(this.invoke(p1))
    }
}

fun main(args: Array<String>) {
    //(5+8)*2
    val res = multiplyBy2(add5(8))
    println(res)
    //複合後
    val and5AndMultiplyBy2 = add5 andThen multiplyBy2
    println(and5AndMultiplyBy2(8))
}

哦 好tm的複雜

我們來簡單解析一下

//拆解上面一下
/*
p1 p2 代表參數
R代表返回值
p1 8
p2 add5的返回值

* andThen 是擴展方法。擴展的方法1
* infix 是中綴表達式,不用點也不用括號
* Function1  代表傳入一個參數的函數 <P1, P2>  p1代表參數類型 p2代表返回值類型
* andThen 後面的  Function1<P2, R>  代表 multiplyBy2
*
* */

還有一種

compose寫法
package com.yzdzy.kotlin.chapter5.componse

//求f(g(x))
// 如果m(x)=f(g(x))
//那麼 m就是fgx的複合

val add5 = { i: Int -> i + 5 }
val multiplyBy2 = { i: Int -> i * 2 }

//複合函數
infix fun <P1, P2, R> Function1<P1, P2>.andThen(function: Function1<P2, R>): Function1<P1, R> {
    return fun(p1: P1): R {
        return function.invoke(this.invoke(p1))
    }

}

//拆解上面一下
/*
p1 p2 代表參數
R代表返回值
p1 8
p2 add5的返回值

* andThen 是擴展方法。擴展的方法1
* infix 是中綴表達式,不用點也不用括號
* Function1  代表傳入一個參數的函數 <P1, P2>  p1代表參數類型 p2代表返回值類型
* andThen 後面的  Function1<P2, R>  代表 multiplyBy2
*
* */
infix fun <P1, P2, R> Function1<P2, R>.compose(function: Function1<P1,P2>):Function1<P1,R>{
    return fun(p1:P1):R{
        return this.invoke(function.invoke(p1))
    }
}


fun main(args: Array<String>) {
    //(5+8)*2
    val res = multiplyBy2(add5(8))
    println(res)
    //複合後
    val and5AndMultiplyBy2 = add5 andThen multiplyBy2
    //m(x) = f(g(x))
    println(and5AndMultiplyBy2(8))
    val and5ComposeMultiplyBy2 = add5 compose  multiplyBy2
    //m(x) = g(f(x))
    println(and5ComposeMultiplyBy2(8))
}

26
26
21
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章