-1

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

一些背景:大约一周前,我决定学习使用 Clojure 编程,自学函数式编程。(白天我是一名主要使用 C# 的 Web 开发人员。

因此,根据我的经验,学习一门语言的最佳方式是从一个项目开始。无论如何,我选择创建我需要的东西,一个小工具,用于从 XML 文件中读取文本片段,然后在其他文本文件中进行一些查找和替换(并检测不一致。

所以我已经完成了将文件解析为我需要的地图列表的部分,这就是问题所在:按照我的看法,我可以在函数之间尽可能多地传递我的数据,在在某些时候,我的程序没有什么可做的。然后当用户单击 (javax.swing-button) 时,我的程序将忘记所有内容。

函数式程序员将如何解决这个问题?

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

-单子。(非常适合构建复杂性,但在功能停止执行时仍然会消失。

- 每次用户单击按钮时再次从磁盘读取文件:看起来很傻。

- 将我的文件内容存储在我的表单控件中。似乎是在作弊(而且也是错误的。

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

谁能告诉我我是否正确地将其识别为没有 ^dynamic var 就无法做到的情况?

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

编辑:我不是要代码示例,只是一个是或否的答案,也许是关于下一步要查找什么的提示,问题是:有没有办法让 clojure 程序记住它计算的一些数据,处于空闲状态(直到下一个 java 事件处理程序被触发),而不使用全局变量、原子、引用或代理?

我问的原因是我想以正确的方式学习以功能样式进行编程,并且我基本上是在检查我是否不会偏离轨道。

感谢迄今为止所有有用的回复,肯定有阅读书籍的提示,这总是很好。

4

2 回答 2

3

因此,根据我的经验,学习一门语言的最佳方式是从一个项目开始。

当您停留在相同的范式中时,这可能是正确的——例如命令式编程。无论您已经使用了多少“函数式编程技术”,命令式思维方式都会保持不变。从命令式思维方式转变为功能性思维方式可能会非常不和谐。

要开始改变这种心态,请从Clojure the BraveLiving Clojure等基础知识开始;开始练习4clojureClojure Koans

Clojure 不会消除可变性,而是默认消除可变性- 即它迫使您考虑是否绝对有必要改变某些东西以实现您的目标。一旦您确定需要可变性,您就可以选择VarsRefsAgentsAtoms - 每个都有自己的优点和缺点。

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

公平地说,与学习另一种 OO 语言相比,这真的很难。学习曲线陡峭。在第一个月里,我一直觉得自己像是在去日本旅行,在那里我不能读、写或说话,只能靠咕哝和指点。

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

于 2016-04-04T18:16:12.610 回答
0

对于您的问题,Clojure 特定的答案几乎肯定不是使用^dynamic,而是使用代理原子refs

但我相信你的问题更像是一个哲学问题而不是实际问题?对 Simon Peyton Jones 的采访是我对这个问题最喜欢的解释。一个纯粹的(最纯粹的纯粹意义上的)函数式程序没有副作用,因此是无用的。然而,正如 Simon 在采访中所说,函数式语言都提供了引入有限的、受控的副作用的方法,以避免污染程序的纯函数方面。Haskell 通过其类型系统(monads、monoids 和范畴论)来做到这一点。Clojure 通过代理、原子和引用来实现。Elm 通过信号来做到这一点。Erlang 通过进程和消息队列来做到这一点。等等...

于 2016-04-05T11:33:22.783 回答