请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

网上了解的概念

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

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

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

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

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

正在回答

4回答

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 Da丶 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-02-20 09:42:28
  • 提问者 Da丶 #2
    有点明白了,柯里化是将函数一个一个拆开,反柯里化是将函数一个一个合起来.
    回复 有任何疑惑可以回复我~ 2019-02-20 09:44:12
  • bennyhuo 回复 提问者 Da丶 #3
    对对,看了下你发的那个文章,感觉不是再说柯里化。。。
    回复 有任何疑惑可以回复我~ 2019-02-20 09:45:10
bennyhuo 2019-02-20 12:23:24
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 回复 有任何疑惑可以回复我~
提问者 Da丶 2019-02-20 11:42:54

按照老师的方式试着写出来简单版,虽然感觉怪怪的,但是意思终于是明白了

```

/**
* 柯里化函数简化
*/
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 回复 有任何疑惑可以回复我~
  • 反柯里化也要返回函数的,不能直接就调用了。以及泛型可以指定一个上限为 Function1<P, Function1<*>>,因为柯里化之后得到的函数类型是接受一个参数返回函数或者其他类型的函数。。算了我给你写一个吧。。
    
    
        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()      = fun(p1: P1, p2: P2) = this(p1)(p2)
    回复 有任何疑惑可以回复我~ 2019-02-20 12:21:49
  • 提问者 Da丶 回复 bennyhuo #2
    这下明白了,不管柯里化还是反柯里化,归根结底都是函数之间的转换.
    柯里化是 将多个参数的函数,拆成一个参数嵌套一个参数的函数
    反柯里化 是将一个参数嵌套一个参数的函数 转换成 一下子将所有参数全部传递进去的函数
    回复 有任何疑惑可以回复我~ 2019-02-20 12:33:50
  • 提问者 Da丶 回复 bennyhuo #3
    感谢老师
    回复 有任何疑惑可以回复我~ 2019-02-20 12:34:02
提问者 Da丶 2019-02-20 09:41:11

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

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

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

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

0 回复 有任何疑惑可以回复我~
  • 我是说你发的文章概念描述有问题,先把概念探讨清楚吧。js我不是很熟,感觉他们的实现有概念引申或者也许概念混淆。
    回复 有任何疑惑可以回复我~ 2019-02-20 09:44:37

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信