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