学完柯里化,之后了解下反柯里化,貌似反柯里化在Kotlin实现不了
来源:5-7 柯里化(Currying)-函数调用链

Da丶
2019-02-20
网上了解的概念
函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了固定参数, 延迟计算等。
那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用范围,创建一个应用范围更广的函数。使得本来只有特定对象才适用的方法,扩展到更多的对象。
但是我觉得,Kotlin还是强类型的语言.不同的对象调用不存在的方法,这好像有点问题.
另外网上大多数实现都是Js的实现方式,大多数都是将传入的this指向改变,并且获取到Function的传入参数,这一点好像在Kotlin不支持.
老师不知道我理解的对不对.而且反柯里化的概念貌似真的不好理解.
4回答
-
这个博客说的概念是偏函数吧,柯里化是把一个多参数函数变为函数调用链。
你看看维基百科对柯里化的数学定义:
https://en.m.wikipedia.org/wiki/Currying按照这个定义,理论上我们可以在kotlin中实现反柯里化的其实,接收一个函数,判断他的返回值是不是函数类型,如果是再递归的看这个函数的返回值是不是函数,直到返回值类型不是函数,然后构造一个新函数把这些中间的函数的参数都穿入就可以了。
062019-02-20 -
bennyhuo
2019-02-20
fun <P1, P2, R> Function2<P1, P2, R>.currying() = fun(p1: P1) = fun(p2: P2) = this(p1, p2) fun <P1, P2, R> Function1<P1, Function1<P2, R>>.uncurrying(): (P1, P2) -> R = fun(p1: P1, p2: P2) = this(p1)(p2)
一对儿柯里化和反柯里化的代码。注意返回的仍然是函数类型。我们基于这个思路支持更多参数的函数,但本质一样。
20 -
Da丶
提问者
2019-02-20
按照老师的方式试着写出来简单版,虽然感觉怪怪的,但是意思终于是明白了
```
/**
* 柯里化函数简化
*/
fun <P1, P2, P3, R> Function3<P1, P2, P3, R>.curried() =
fun(p1: P1) =
fun(p2: P2) =
fun(p3: P3) =
invoke(p1, p2, p3)/**
* 反柯里化
*/
fun <P1, P2, P3> Function1<P1, Any>.uncurried(p1: P1, p2: P2, p3: P3) {
val fun2 = this.invoke(p1) as Function1<P2, Any>
val fun3 = fun2.invoke(p2) as Function1<P3, Any>
fun3.invoke(p3)
}```
使用
```
//柯里化使用
::log.curried()("Tag")(System.out)("Hello World")
//反柯里化
::log.curried().uncurried("Tag", System.out, "Hello World")```
可能理解的还不是那么深,但是我觉得现阶段理解到这里,差不多够用了.
032019-02-20 -
Da丶
提问者
2019-02-20
重新整理一下,昨晚提问的有点晚比较迷糊..
第一点是柯里化的普适,扩大适用范围,这块感觉有点难实现.我这里是从kotlin是强类型角度考虑的,在传入参数时,就能判断出这个对象是否存在这个Fun.
第二点:网上这些类似文章里面的描述大部分都是将调用this给变更了,有点像T.()->R 给T给变更了的那种感觉.而且Kotlin的Function并不支持获取args以及其他的操作.
所以我觉得在Kotlin里面是不是实现不了反柯里化
012019-02-20
相似问题