学完柯里化,之后了解下反柯里化,貌似反柯里化在Kotlin实现不了

来源:5-7 柯里化(Currying)-函数调用链

Da丶

2019-02-20

网上了解的概念

函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了固定参数, 延迟计算等。

那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用范围,创建一个应用范围更广的函数。使得本来只有特定对象才适用的方法,扩展到更多的对象。

但是我觉得,Kotlin还是强类型的语言.不同的对象调用不存在的方法,这好像有点问题.

另外网上大多数实现都是Js的实现方式,大多数都是将传入的this指向改变,并且获取到Function的传入参数,这一点好像在Kotlin不支持.

老师不知道我理解的对不对.而且反柯里化的概念貌似真的不好理解.

写回答

4回答

bennyhuo

2019-02-20

这个博客说的概念是偏函数吧,柯里化是把一个多参数函数变为函数调用链。

你看看维基百科对柯里化的数学定义:
https://en.m.wikipedia.org/wiki/Currying

按照这个定义,理论上我们可以在kotlin中实现反柯里化的其实,接收一个函数,判断他的返回值是不是函数类型,如果是再递归的看这个函数的返回值是不是函数,直到返回值类型不是函数,然后构造一个新函数把这些中间的函数的参数都穿入就可以了。

0
6
bennyhuo
回复
Da丶
不过你真的好认真呀,点赞
2019-02-20
共6条回复

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)

一对儿柯里化和反柯里化的代码。注意返回的仍然是函数类型。我们基于这个思路支持更多参数的函数,但本质一样。

2
0

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")

```

可能理解的还不是那么深,但是我觉得现阶段理解到这里,差不多够用了.

0
3
Da丶
回复
bennyhuo
感谢老师
2019-02-20
共3条回复

Da丶

提问者

2019-02-20

重新整理一下,昨晚提问的有点晚比较迷糊..

第一点是柯里化的普适,扩大适用范围,这块感觉有点难实现.我这里是从kotlin是强类型角度考虑的,在传入参数时,就能判断出这个对象是否存在这个Fun.

第二点:网上这些类似文章里面的描述大部分都是将调用this给变更了,有点像T.()->R 给T给变更了的那种感觉.而且Kotlin的Function并不支持获取args以及其他的操作.

所以我觉得在Kotlin里面是不是实现不了反柯里化

0
1
bennyhuo
我是说你发的文章概念描述有问题,先把概念探讨清楚吧。js我不是很熟,感觉他们的实现有概念引申或者也许概念混淆。
2019-02-20
共1条回复

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程