【问题标题】:Can we consider Clojure's STM 'functional'? [closed]我们可以考虑 Clojure 的 STM 的“功能性”吗? [关闭]
【发布时间】:2023-03-22 06:20:02
【问题描述】:

我们知道pure functions

  1. 对于给定的输入总是返回相同的结果
  2. 不产生副作用

这将我们引向referential transparency - 一个表达式可以用一个值替换而不改变程序的行为

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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


      Clojure 也以其他方式分层。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 1970-01-01
          • 2021-02-12
          • 2022-01-24
          • 2021-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多