我们可以考虑Clojure的STM'功能性'?

时间:2016-03-11 09:56:03

标签: clojure functional-programming stm purely-functional referential-transparency

我们知道pure functions

  1. 始终为给定输入返回相同的结果
  2. 不产生副作用
  3. 这导致我们referential transparency - 其中表达式可以用值替换,而不会改变程序的行为

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

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我们可以考虑Clojure的STM'功能性'

没有。恰恰相反。 STM被设计为有状态的,不纯的,引用不透明的,但是你想要它。但是,正如您所指出的那样,就像数据库事务一样。

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

Clojure也以其他方式分层。

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

答案 2 :(得分:1)

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