2

我们知道纯函数

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

这使我们实现了引用透明性——在不改变程序行为的情况下,可以将表达式替换为值

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

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

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

4

3 回答 3

6

Clojure STM 故意不是“纯功能性的”,因为它旨在管理状态,并且更新状态是一种副作用。这反映了 Clojure 的设计理念,它是一种默认情况下更喜欢函数式编程的语言,但仍为您提供了以希望受控的方式执行有用/有状态的事情的工具。

于 2016-03-11T13:48:35.070 回答
2

我们可以考虑 Clojure 的 STM 的“功能性”吗?

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

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


Clojure 也以其他方式分层。

  • 许多控制结构(and, when, ... )通过宏在一些特殊形式上分层。
  • 大多数核心功能 - 用 Clojure 编写 - 都在 JVM(或其他主机)中实现的少数分层上,JVM(或其他主机)配备了clojure.lang实现它们的包。
于 2016-03-11T17:01:55.133 回答
1

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

于 2016-03-11T11:42:10.750 回答