一、首先看一个小例子,做个铺垫
package net.println.kotlin.chapter5.currying
/**
* @author:wangdong
* @description:柯里化——函数调用链
*/
/**定义一个Hello的方法*/
//传入三个参数,返回一个Boolean类型的值
fun hello(x: String,y: Int,z: Double):Boolean{
return true;
}
/**定义一个柯里化的方法
* 1.传入一个String类型的参数x
* 2.返回了一个函数,这个函数又传入了一个Int类型的y
* 3.又返回了一个函数,这个函数又传入了一个Double类型的z
* 柯里化就是完成:
* 有多个参数的函数,变换成一系列单参数的函数的变换
*/
fun curriedHello(x: String):(y: Int) -> (z:Double) -> Boolean{
}
二、柯里化更详细的例子(日志打印)
package net.println.kotlin.chapter5.currying
import java.io.OutputStream
/**
* @author:wangdong
* @description:柯里化——函数调用链
*/
/**
* 写一个打日志的东西
*/
fun log(tag: String,target: OutputStream,message: Any?){
//打日志"\n"是换行的意思
target.write("[$tag] $message\n".toByteArray())
}
/**
* 柯里化它
* 1.首先传tag
* 2.返回一个函数,函数再传target
* 3.返回一个函数,函数再传Any
*/
/*
* 这样写下去就很复杂了
fun log(tag: String): (target: OutputStream) -> (message: Any?){
}*/
/***
* 用一个简单的写法
*/
/*fun log(tag: String)
=fun(target: OutputStream)
=fun(message: Any?)
= target.write("[$tag] $message\n".toByteArray())*/
fun main(args: Array<String>) {
log("benny",System.out,"HelloWorld")
//log("benny")(System.out)("HelloWorld Again")
::log.curried()("benny")(System.out)("HelloWorld Again")
}
/**
* 这个柯里化就非常简单了
* 写一个扩展函数
* 三个参数那么就扩展Function3了
* 这样写就对了,目前请不要过分深究,他日在细细研究
*/
fun <P1,P2,P3,R> Function3<P1,P2,P3,R>.curried()
=fun (p1: P1) = fun (p2: P2) = fun (p3: P3) = this(p1,p2,p3)