我们知道pure functions:
这导致我们referential transparency - 其中表达式可以用值替换,而不会改变程序的行为。
这告诉我们,如果某个程序排除了程序运行环境中实体的破坏性修改(更新),则该程序可以说是purely functional。
当我们查看Software Transactional Memory时,我们看到一种类似于数据库事务的并发控制机制,用于控制对并发计算中共享内存的访问。但是没有任何关于它本身特别有用。
我的问题是:我们可以考虑Clojure的STM'功能性'
答案 0 :(得分:4)
Clojure STM故意不是"纯功能"因为它旨在管理状态,而更新状态是一种副作用。这反映了Clojure的设计理念是一种默认情况下喜欢功能编程的语言,但仍然以有希望的控制方式为您提供有用/有状态的工具。
答案 1 :(得分:2)
我们可以考虑Clojure的STM'功能性'
没有。恰恰相反。 STM被设计为有状态的,不纯的,引用不透明的,但是你想要它。但是,正如您所指出的那样,就像数据库事务一样。
Clojure是一种分层语言。 STM位于核心纯函数和数据结构之上,在单个构造中隔离状态变化 - ref - 它提供了一个词汇来操作。
Clojure也以其他方式分层。
and
,when
,......)都是分层的
通过宏的特殊形式。 clojure.lang
包来实现它们。答案 2 :(得分:1)
Clojure STM没有引用透明性,因为结果可能每次都不同,具体取决于多个线程中的操作交错。