gpt4 book ai didi

design-patterns - Clojure 中功能状态更新的模式/习惯用法

转载 作者:行者123 更新时间:2023-12-02 06:42:09 25 4
gpt4 key购买 nike

我决定尝试用 Clojure 编写模拟程序(作为概念证明),其中:

  • 模拟的整个状态都存储在一个单一的不可变数据结构中
  • 状态更新表示为将一个状态映射到下一个状态的函数

这意味着我可以像这样写一个更新函数:

(defn example-update-function [old-state]
(let [state (atom old-state)]
(swap! state some-other-update-function-1)
(if (some-condition @state)
(swap! state some-conditional-update-function))
(swap! state some-other-update-function-2)
(reset! state (some-function @state some-other-param))
@state))

该方法似乎有效,但以下原因让我感到担忧:

  • 我不得不使用可变原子来管理中间状态...看起来不太实用!
  • 到处都是 swap!s 和 @state 取消引用,代码看起来有点难看。

是否有更好/更优雅的方法?

最佳答案

你可以这样写:

  (defn change-when     "If (test val) is truethy, returns (fun val), else returns val"    [val test fun] (if (test val) (fun val) val))  (defn example-update-function [old-state]    (-> old-state        some-other-update-function-1        (change-when some-condition some-conditional-update-function)        some-other-update-function-2        (some-function some-other-param)        identity))

大概在monads的道路上走到了一半......

关于design-patterns - Clojure 中功能状态更新的模式/习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5995615/

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