我们知道纯函数:
- 始终为给定输入返回相同的结果
- 无副作用
这导致我们引用透明度 - 表达式可以在不改变程序行为的情况下替换为值。
这告诉我们,如果一个程序排除了程序运行环境中实体的破坏性修改(更新),则可以说它是纯功能性的。
当我们查看软件事务内存时,我们看到一种类似于数据库事务的并发控制机制,用于控制对并发计算中共享内存的访问。但是,这本身没有什么特别实用的。
我的问题是:我们可以认为Clojure的STM是"功能性的"吗?
Clojure STM故意不是"纯功能",因为它旨在管理状态,而更新状态是一种副作用。这反映了 Clojure 的设计理念,即一种默认更喜欢函数式编程的语言,但仍然为您提供了以希望可控的方式执行有用/有状态操作的工具。
我们可以认为Clojure的STM是"功能性的"吗?
不。恰恰相反。STM 被设计为有状态的、不纯的、引用不透明的,无论您想怎么说。但以一种很好的方式,正如你所指出的,类似于数据库事务。
Clojure是一种分层语言。STM 位于核心纯函数和数据结构之上,将状态更改隔离在单个构造 - refs 中,它提供了一个要操作的词汇表。
Clojure在其他方面也有层次感。
- 许多控制结构(
and
、when
、...)是分层的。通过宏的特殊形式。 - 大多数核心函数 - 用Clojure编写 - 都是分层的在 JVM(或其他主机)中实现的少数,配备使用
clojure.lang
包来实现它们。
Clojure STM 没有引用透明度,因为每次的结果都可能不同,具体取决于多个线程中的操作交错。