java 科里化_关于柯里化(curry)
在实际使用的过程中对柯里化有了一些无法从书本上直接获得的感受。
在JAVA中函数不是头等公民,必须通过接口进行外观统一以后,才能通过实例作为载体进行处理逻辑的传递,
最容易理解的例子莫过于Strategy Pattern,这里就不复述这个概念了。
但是实际上大家都应该遇见过参数个数或者类型无法完全统一的困扰,这个时候我们是怎么办的呢?参数个数不统一,我们可以通过使用构造函数在生成实例的时候传递进去,参数类型不统一的话只能通过Adaptor或者额外抽象出一层来解决,在JAVA中也只能做到这样了。
如何避免这个问题的呢?需要两个前提:1.函数是头等公民可以自由传递;2.柯里化
看起来函数式完全符合要求,这两个前提的组合下可以很轻量的解决我们在JAVA中遇见的问题:
def commonOp[T](list: List[T])(f: List[T] => List[T]): Option[List[T]] = {
list match {
case h :: t => Some(f(t))
case _ => None
}
}
val list = List(1, 3, 4, 5)
val tailer = (list: List[Int]) => list
val adder = (n: Int) => (list: List[Int]) => n :: list
println(commonOp(list)(tailer)) //打印的结果是去掉了头的list,List(3,4,5)
println(commonOp(list)(adder(5)))
//打印的结果是替换了头的List,List(5,3,4,5),这里应用了柯里化函数的第一个参数,目的就是整形函数外观
例子可能有些牵强,但这里只是想表达柯里化如何工作而已,不必在意。
tailer传入一个List,不做任何处理直接返回
adder传入一个List和一个n,把n作为头加在list的前面
commonOp两个参数,list和处理list的function,其中function的入参是list,出参也是list
上面的tailer和adder都需要带入到commonOp的第二个function函数参数中。
commonOp的function函数参数实际的类型是Function1,tailer直接带入没有问题,但是adder就不行了,
所以要在外部将adder变成一个偏应用函数,先传入n之后,类型从Function2变成了Function1,柯里化可以对函数外观进行整形,偏应用函数也有同样作用
很轻巧,和JAVA的重量天壤之别。
java 科里化_关于柯里化(curry)相关推荐
- 柯里化函数(Currying),什么是柯里化,为什么要进行柯里化,高级柯里化函数的实现
柯里化(Currying) 柯里化(Currying)是一种关于函数的高阶技术.它不仅被用于 JavaScript,还被用于其他编程语言. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, ...
- 函数的 柯里化和反柯里化
函数1 函数的柯里化 柯里化(currying)是把接收多个参数的函数变换成为接收一个部分参数的函数,并返回接收余下参数的新函数的技术.通常这个参数是一个. 可能我们对这个解释不太明白. 现在我们来思 ...
- 什么是函数柯里化,函数柯里化的应用场景,函数柯里化的优缺点
函数柯里化 1. 什么是函数柯里化? 2. 函数柯里化面试题 3. 应用场景 1. 什么是函数柯里化? 函数柯里化是js闭包的典型应用.所以缺点就是闭包造成的缺点,占用内存较多等 什么是函数柯里化?就 ...
- 函数柯里化与反柯里化
柯里化 比如想要个函数计算一个月一共花了多少钱: let sumMoney=0; function cost(money){sumMoney+=money; } cost(100); cost(50) ...
- java增大字體_往JRE里增加字体
Adding Fonts to the java Runtime 要加一种亚洲字体进JRE,请按以下步骤进行: 1.装入字体 首先,你必须装载中文.日文.韩文或传统的中文字体(楷书.宋体等)到你的系统 ...
- 尤克里里怎么样_尤克里里和吉他区别?尤克里里与吉他相比有什么不可替代的优势...
尤克里里和吉他有什么区别? 想必大家都见过尤克里里吧,就是类似吉他形状的一种小型弦拨乐器. 我们可以简单的认为:尤克里里是简化版本的吉他,更加简单,更加便宜. 小编弹的就是尤克里里 2.从外观上:吉他 ...
- 尤克里里怎么样_尤克里里入门简单教程
相比吉他的六弦,尤克里里只有四弦,这就在学习上要轻松不少.但是,即使是四弦,也有尤克里里的指法图.在学习尤克里里之前,一定要知道的尤克里里四弦对应的四音.尤克里里第四到第一弦的空弦对应的是GCEA四个 ...
- 最简单的科赫雪花_简单地雪花化
最简单的科赫雪花 At Opendoor, data is central to everything we do. It follows, then, that the platform that ...
- java语言文本挖掘 分词_文本挖掘分词mapreduce化
软件版本 paoding-analysis3.0 项目jar包和拷贝庖丁dic目录到项目的类路径下 修改paoding-analysis.jar下的paoding-dic-home.propertie ...
最新文章
- 收藏 | 2018年AI三大顶会中国学术成果全链接(附视频、PPT、论文)
- 关于uWSGI服务器的安装和启动(一)
- VUE—从入门到飞起(一)
- java的语法知识_Java语法知识点
- javascript --- [jsonp] script标签的妙用(绕过同源限制)
- java excel类库,jExcelApi Java 操作 Excel 的类库
- mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...
- 三层结构下的DBHelper方法
- 等级保护2.0常见问题集
- sparkR介绍及安装
- 如何防止editor中出现遮行的现象
- 2004世界五百强企业
- python爬网络图片脚步_python爬虫入门 实战(五)---用webdriver实现批量自动发微博...
- 学生:无效文件.dsn问题
- 黄一老师:征信问答这些信用知识你都了解吗?
- Redis 运维实战 第07期:Hotkey
- There is no 'root'@'%' registered解决
- SpringCloud的实用篇
- Oracle中索引的创建和使用
- pycharm设置-使用Qt Designer配置
热门文章
- 《计算机组成原理》第三章运算方法与运算器 部分课后习题答案 清华大学出版_秦磊华_谭志虎
- spring packagesToScan无法扫描到jar中类的解决办法
- 抓娃娃机按钮按几下_剪刀机娃娃最后一下按住几秒,剪刀娃娃机玩法
- 长兴鸿蒙母亲节,祝湖北省枣阳市所有的母亲”母亲节”快乐!
- 弄懂Android Studio的canary、dev、stable、beta版本的区别
- AutoHotKey自定义快捷键启动最小化某个程序(修改版)
- MFC—使用DrawText和TextOut编辑文字
- HTML5期末大作业:美食主题网站设计——美食主题(6页) HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
- 使用Go语言播放Mp3文件
- ARM LDR和ADR指令