【33】kotlin 偏函数

不羁的心 提交于 2020-07-27 13:08:20

理解偏函数的概念

  •  传入部分参数 得到新函数

仔细体会与Currying的不同

  • 面向场景不同 Currying一串函数调用 

了解 偏函数的实现方法

 

 

package com.yzdzy.kotlin.chapter5.currying

import com.sun.org.apache.xpath.internal.functions.Function2Args
import java.io.OutputStream
import java.nio.charset.Charset

fun log(tag: String, target: OutputStream, message: Any?) {
    target.write("[$tag] $message\n".toByteArray())

}

//fun log(tag: String) = fun(target: OutputStream) = fun(message: Any?) = target.write("[$tag] $message\n".toByteArray())

fun <P1, P2, P3, R> Function3<P1, P2, P3, R>.curried() =
    fun(p1: P1) = fun(p2: P2) = fun(p3: P3) = this(p1, p2, p3)

fun main(args: Array<String>) {
    log("benny", System.out, "Hello world")

    ::log.curried()("benny")(System.out)("Hello world again")
    //原函数的偏函数
    val consoleLogWithTag = (::log.curried()("benny")(System.out))
    consoleLogWithTag("Hello Agagin1")
    consoleLogWithTag("Hello Agagin2")
    consoleLogWithTag("Hello Agagin3")
    val bytes="我是中国人".toByteArray(charset("GBK"))
    //偏函数
    val StringFromGBK= makeStringFromGbkBytes(bytes)

}

//上面的偏函数都是已经设置了签名的参数 后面再去使用  下面的案列将自定义第二个函数 然后传递前面的函数就行了
val makeString = fun(byteArray: ByteArray, charset: Charset): String {
    return String(byteArray)
}

//
val makeStringFromGbkBytes = makeString.partial2(charset("GBK"))

fun <P1, P2, R> Function2<P1, P2, R>.partial2(p2: P2) = fun(p1: P1) = this(p1, p2)
fun <P1, P2, R> Function2<P1, P2, R>.partial1(p1: P1) = fun(p2: P2) = this(p1, p2)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!