【问题标题】:Functional programming with clojure, avoiding mutable state [closed]使用 clojure 进行函数式编程,避免可变状态
【发布时间】: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


【解决方案1】:

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

当您保持相同的范式时,这可能是正确的 - 例如命令式编程。无论您已经使用了多少“函数式编程技术”,命令式思维方式往往会保留下来。从命令式思维方式功能性思维方式可能会很不和谐。

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

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

来自RxJS is great. So why have I moved on? — Medium 参考 ClojureScript:

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

另见:Teaching Clojure at IBM - Steve Shogren

【讨论】:

    【解决方案2】:

    对于您的问题,Clojure 特定的答案几乎可以肯定是不使用 ^dynamic,而是使用 agentatomrefs

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2022-07-17
      • 2019-05-05
      • 2011-12-07
      相关资源
      最近更新 更多