用clojure进行函数式编程,避免可变状态

所以,我的问题是关于我的程序需要做的特定操作中是否可以避免可变状态。

一些情况:大约一个星期前,我决定学习使用Clojure进行编程,以教授自己的函数式编程。 (在白天,我作为一个主要使用C#的Web开发人员工作。

所以根据我的经验,学习语言的最好方法是从一个项目开始。 我选择创建一些我需要的东西,这是一个小工具,用于从XML文件中读取文本片段,然后在其他文本文件中查找和替换(并检测不一致性。

所以,我已经将文件解析成我需要的地图列表,这就是问题所在:我看到它的方式,我可以根据需要在函数间传递数据有些观点认为我的计划没有什么可做的。 然后当用户点击一个(javax.swing-button)时,我的程序将会忘记一切。

功能程序员如何解决这个问题?

我想出了可能的解决方案:

-Monads。 (非常适合构建复杂性,但在函数停止执行时仍然消失。

- 每当用户点击一个按钮时再次从磁盘读取文件:看起来很愚蠢。

- 在我的表单控件中存储我的文件的内容。 看起来像是作弊(也是错误的。

当文件被解析时,创建一个引用结果数据结构的闭包,并安装这个新的事件处理程序:看起来像是作弊,而且通常只是一个奇怪的(但有趣的)尝试。

谁可以告诉我, 如果我已经正确地将其识别为没有^动态变量的情况下我无法做到的情况?

任何指针将不胜感激。)))))

编辑 :我没有要求提供代码示例,只是回答是或不回答,或者提示接下来要查找的内容,是否有一种方法让clojure程序记住它计算的某些数据,处于空闲状态(直到下一个java事件处理程序被触发),而不使用全局变量,atom,ref或agent?

我问的原因是我想学习以适当的方式编写功能性的风格,而且我基本上是检查我是否没有偏离轨道。

感谢迄今为止所有有用的反应,绝对有书籍阅读提示,这总是很好。


对你的问题Clojure特定的答案几乎肯定不是使用^dynamic ,而是使用代理,原子或参考。

但我相信你的问题比实际更具哲理性? 这个采访Simon Peyton Jones是我对这个问题的最喜欢的解释。 纯粹的(纯粹的纯粹的)功能性程序没有副作用,因此是无用的。 正如西蒙在访谈中所说,功能语言都提供了引入有限的,受控的副作用的方法,以避免污染程序的纯功能方面。 Haskell通过它的类型系统(monad,monoids和category theory)来完成这个工作。 Clojure通过代理,原子和参考来完成它。 榆树通过信号做到这一点。 Erlang通过进程和消息队列完成它。 等等...


所以根据我的经验,学习语言的最好方法是从一个项目开始。

当你处于相同的范式时,这可能是事实 - 例如命令式编程。 无论您已经使用了多少“功能性编程技术”,命令性思维倾向于保持。 从必要的思维模式转向功能性思维模式可能会非常棘手。

从Clojure the Brave或Living Clojure这样的基础开始改变这种思维方式, 开始练习4cljure和Clojure Koans。

Clojure默认不会消除可变性但是可变性 - 也就是说它会强制你考虑是否有必要改变某些东西来完成你的目标。 一旦你确定需要可变性,你可以选择Vars,Refs,Agents和Atom--每种都有自己的优点和缺点。

从RxJS很棒。 那为什么我继续前进? - 参考ClojureScript的媒介:

相比学习另一种面向对象语言来说,公平起来真的很难。 学习曲线陡峭。 在第一个月里,我一直觉得自己正在去日本旅行,因为我无法读写或说话,只能依靠咕and和指点。

另请参阅:在IBM教授Clojure - Steve Shogren

链接地址: http://www.djcxy.com/p/80849.html

上一篇: Functional programming with clojure, avoiding mutable state

下一篇: Struggling with the basics