可以考虑Clojure的STM'functional'吗?
Can we consider Clojure's STM 'functional'?
我们知道pure functions:
- 对于给定的输入总是return相同的结果
- 没有副作用
这将我们引向 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 也以其他方式分层。
- 许多控制结构(
and
、when
、...)分层在几个
通过宏的特殊形式。
- 大多数核心功能 - 用 Clojure 编写 - 都分层在
少数在 JVM(或其他主机)中实现,它配备
使用
clojure.lang
包来实现它们。
我们知道pure functions:
- 对于给定的输入总是return相同的结果
- 没有副作用
这将我们引向 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 也以其他方式分层。
- 许多控制结构(
and
、when
、...)分层在几个 通过宏的特殊形式。 - 大多数核心功能 - 用 Clojure 编写 - 都分层在
少数在 JVM(或其他主机)中实现,它配备
使用
clojure.lang
包来实现它们。