gpt4 book ai didi

Clojure 状态中的状态中的状态

转载 作者:行者123 更新时间:2023-12-03 21:14:07 26 4
gpt4 key购买 nike

我很想听听这里的 Clojure 专家对于在层次结构中管理状态有什么建议。我发现我经常使用 {:structures {:like {:this {:with {:many 'levels}} } } }如果我想在多个级别跟踪状态的变化,通过在值周围扔原子 (atom {:like (atom 'this)} ) ,我发现自己认为这一定是错误的。在顶层只使用一个原子,并且在映射中没有任何值通常会更好吗?

最佳答案

如果可能,不要在数据结构中使用嵌套原子。

主要原因是不变性是你的 friend 。 Clojure 是一种以不可变数据结构为基础的函数式语言。大多数库都采用不可变的数据结构。 Clojure 的 STM 假定不可变数据结构以获得最佳并发性。不变性让您有机会在任何时刻拍摄整个状态的一致快照。对不可变数据进行操作的纯函数易于开发和测试。

如果您将原子放入数据结构中,那么您将失去不变性的所有优势,并冒着使您的代码变得非常复杂的风险——如果数据结构包含许多可变组件,则很难推理它。

一些建议的替代方法:

  • 将整个数据结构放在一个 ref 或 atom 中。这可以是一个没有问题的巨大数据结构 - 我曾经写过一个游戏,其中整个游戏 map 都被保存在一个原子中,没有任何困难。
  • 使用为访问和更改嵌套的不可变数据结构而设计的各种方法:assoc-in , get-in , update-in
  • 使用递归函数使导航数据结构更易于管理。如果您的结构的一个节点具有相同“类型”的子节点,那么这通常是一个很好的提示,您应该使用某种形式的递归函数。
  • 关于Clojure 状态中的状态中的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117404/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com