理解偏函数的概念
-
传入部分参数 得到新函数
仔细体会与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)