我们可以认为Clojure的STM是"功能性的"吗?



我们知道纯函数:

  1. 始终为给定输入返回相同的结果
  2. 无副作用

这导致我们引用透明度 - 表达式可以在不改变程序行为的情况下替换为值

这告诉我们,如果一个程序排除了程序运行环境中实体的破坏性修改(更新),则可以说它是纯功能性的。

当我们查看软件事务内存时,我们看到一种类似于数据库事务的并发控制机制,用于控制对并发计算中共享内存的访问。但是,这本身没有什么特别实用的。

我的问题是:我们可以认为Clojure的STM是"功能性的"吗?

Clojure STM故意不是"纯功能",因为它旨在管理状态,而更新状态是一种副作用。这反映了 Clojure 的设计理念,即一种默认更喜欢函数式编程的语言,但仍然为您提供了以希望可控的方式执行有用/有状态操作的工具。

我们可以认为Clojure的STM是"功能性的"吗?

不。恰恰相反。STM 被设计为有状态的、不纯的、引用不透明的,无论您想怎么说。但以一种很好的方式,正如你所指出的,类似于数据库事务。

Clojure是一种分层语言。STM 位于核心纯函数和数据结构之上,将状态更改隔离在单个构造 - refs 中,它提供了一个要操作的词汇表。


Clojure在其他方面也有层次感。

  • 许多控制结构(andwhen、...)是分层的。通过宏的特殊形式。
  • 大多数核心函数 - 用Clojure编写 - 都是分层的在 JVM(或其他主机)中实现的少数,配备使用clojure.lang包来实现它们。

Clojure STM 没有引用透明度,因为每次的结果都可能不同,具体取决于多个线程中的操作交错。

最新更新