可以考虑Clojure的STM'functional'吗?

Can we consider Clojure's STM 'functional'?

我们知道pure functions

  1. 对于给定的输入总是return相同的结果
  2. 没有副作用

这将我们引向 referential transparency - 其中 可以在不改变程序行为的情况下用值替换表达式

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

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

我的问题是:我们可以考虑 Clojure 的 STM 'functional'吗?

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

Clojure STM 有意不是 "pure functional",因为它旨在管理状态,而更新状态是一种副作用。这反映了 Clojure 的设计理念,作为一种默认情况下更喜欢函数式编程的语言,但仍然为您提供了以希望受控的方式做 useful/stateful 事情的工具。

可以考虑Clojure的STM吗'functional'?

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

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


Clojure 也以其他方式分层。

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