变量可变性问题
从FP的角度, Clojure中变量是不可变的, 改变一个变量实际是创建一个新的变量
所以所有的change都需要通过参数的不断传递...
如下面的例子,
=> (defrecord Employee [name room]) backtype.storm.util.Employee => (def emp (Employee. "John Smith" 304)) #'backtype.storm.util/emp => (:name emp) "John Smith" => (assoc emp :room 309) #backtype.storm.util.Employee{:name "John Smith", :room 309} => (println emp) #backtype.storm.util.Employee{:name John Smith, :room 304}
Clojure是一个妥协的语言,
不单纯的从FP的角度思考, 也需要从OO的角度思考, 你可以认为这是灵活的体现
所以有时候, 单纯的依赖参数的传递很麻烦...虽然很pure FP
希望有变量的可变性, 将结果暂存下来, 这样无疑带来了副作用(side effects), 但提供了些便利, 尤其对习惯于oo思维的工程师
两种方法 ,
1. 使用java对象
虽然说clojure变量是不可变的, 但是如果在clojure里面直接使用Java对象, 相当于跳过了clojure这层, 如下面的例子,
=> (import 'java.awt.Point) java.awt.Point => (def pt (Point. 5 10)) #'backtype.storm.util/pt => (.x pt) 5 => (set! (.x pt) -42) -42 => (.x pt) -42
可以看到在storm里面, 仍然有大量的代码是用java实现的, 尤其是类的封装, 为什么不全用clojure? 可以思考
2. 当然clojure并不是没有考虑到这个问题, 他提倡的是管理可变变量
通过ref, atom, 其实是定义reference, 变量本身是不变的, 可以通过swap!将ref或atom切换到不同的变量上
=> (def test-ref (atom {})) #'backtype.storm.util/test-ref => (swap! test-ref assoc :a 1) {:a 1} => @test-ref {:a 1}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《Flume日志收集与MapReduce模式》一第3章 通道
本节书摘来自华章出版社《Flume日志收集与MapReduce模式》一书中的第3章,作者 [美] 史蒂夫·霍夫曼(Steve Hoffman)斯里纳特·佩雷拉(Srinath Perera),更多章节内容可以访问云栖社区“华章计算机”公众号查看 第3章 通道在Flume中,通道指的是位于源与接收器之间的构件。它为流动的事件提供了一个中间区域,从源中读取并且被写到数据处理管道中的接收器的事件处于这个区域中。本章将要介绍的两类通道分别是内存/非持久化通道与本地文件系统/持久化通道。持久化文件通道会在发送者接收到事件前将所有变化写到磁盘上。它要比非持久化的内存通道慢一些,不过可以在出现系统事件或是Flume代理重启时进行恢复。与之相反,内存通道要更快一些,不过在出现失败时会导致数据丢失,并且与拥有大量磁盘空间的文件通道相比,它的存储能力
- 下一篇
Apache Spark机器学习.1.9 小结
1.9 小结 本章介绍了Apache Spark所有的基础知识,这也是所有想把Apache Spark应用于机器学习实际项目的从业者必须理解掌握的。我们重点探讨了Apache Spark计算,并涉及一些最重要的机器学习组件,以便把Apache Spark和机器学习关联起来,让开展机器学习项目的读者做好充分准备。 第一,我们作了Spark总体概述,还讨论了Spark优点以及面向机器学习的Spark计算模型。 第二,我们回顾了机器学习算法,Spark的MLlib库和其他机器学习库。 第三,讨论了Spark RDD的核心创新和DataFrame,以及用于R语言的Spark DataFrame API。 第四,我们回顾了一些机器学习框架,通过案例具体讨论了机器学习的RM4E框架,进一步讨论了Spark机器学习计算框架。 第五,我们讨论了机器学习的工作
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G