【发布时间】:2016-04-04 17:33:48
【问题描述】:
所以,我的问题是关于我是否可以在我的程序需要执行的特定操作中避免可变状态。
一些背景:大约一周前,我决定学习使用 Clojure 编程,自学函数式编程。 (白天,我主要使用 C# 作为 Web 开发人员。
因此,根据我的经验,学习一门语言的最佳方式是从一个项目开始。我选择创建我需要的东西,一个从 XML 文件中读取文本 sn-ps 的小工具,然后在其他文本文件中进行一些查找和替换(并检测不一致。
所以我已经完成了将文件解析为我需要的地图列表的部分,这就是问题所在:按照我的看法,我可以尽可能多地在函数之间传递我的数据想,在某些时候,我的程序无事可做。然后当用户点击一个(javax.swing-button,我的程序会忘记一切。
函数式程序员如何解决这个问题?
我想出的可能解决方案:
-单子。 (非常适合构建复杂性,但在函数停止执行时仍然会消失。
-每次用户单击按钮时再次从磁盘读取文件:看起来很傻。
-将我的文件内容存储在我的表单控件中。看起来像是作弊(而且也是错误的。
-当一个文件被解析时,创建一个包含对结果数据结构的引用的闭包,并将它安装到一个新的事件处理程序中:看起来像是作弊,通常只是一个奇怪(但有趣)的尝试。
谁能告诉我如果我已经正确地将其识别为没有 ^dynamic var 就无法做到的情况?
任何指针将不胜感激。)))))
编辑:我不是要代码示例,只是回答是或否就可以了,也许是关于下一步要查找什么的提示:有没有办法让 clojure 程序记住它计算的一些数据,处于空闲状态(直到下一个 java 事件处理程序被触发),而不使用全局变量、原子、引用或代理?
我问的原因是我想以正确的方式学习以函数式编程,我基本上是在检查我是否不会偏离轨道。
感谢迄今为止所有有用的回复,肯定有关于阅读书籍的提示,这总是很好。
【问题讨论】:
-
我不熟悉 clojure,但总的来说,这个想法是尽可能多地避免可变状态:尽可能多地使用纯函数,然后在您的(大大减少的)不纯代码中使用这些结果。特别是,保留一组预先生成的映射(可以使用纯函数生成的不可变数据结构)并尽可能多地重用它们应该没有问题。
-
您可能应该在 codereview 上分享您的代码以获得建设性的答案。投票结束。
-
@nha 现在看看这就是我的问题的美妙之处。如果您真的费心阅读它,那么代码是无关紧要的。我要求一个是或否的答案:“一个功能程序可以记住用户事件之间没有可变状态的东西吗”并且仍在等待真正了解他的东西的人提供这个答案
-
@IkGaOpReisEnNeemMee 我读了你的问题,没必要咄咄逼人。我发现它的“美”使它不适合 Stack Overflow。你可以试试programmers.stackexchange.com。作为旁注,我认为使用这样的括号会妨碍可读性,无论它看起来多么有趣。
-
那么对不起我评论的语气,我应该先喝咖啡。我想我会试试 codereview
标签: clojure functional-programming state immutability purely-functional