Exception handling 在Clojure中使用纯度处理错误?

Exception handling 在Clojure中使用纯度处理错误?,exception-handling,clojure,functional-programming,either,Exception Handling,Clojure,Functional Programming,Either,我正在做一个游戏,使用大爆炸式的编程方式,将整个状态定义为单个数据结构,并通过交换单个原子来管理状态变化 在游戏中,我们不能信任客户端发送的数据,因此服务器必须预测某些动作无效的可能性并加以防范。当一个人编写一个交换世界状态的函数时,它可以从纯开始;但是,必须考虑无效请求的可能性。我相信在惯用的Clojure中,要想影响不幸的道路,只需抛出例外。因此,现在可能是纯函数的函数受到了副作用异常的影响。也许这是必然的 (try (swap! world update-game) ;possible

我正在做一个游戏,使用大爆炸式的编程方式,将整个状态定义为单个数据结构,并通过交换单个原子来管理状态变化

在游戏中,我们不能信任客户端发送的数据,因此服务器必须预测某些动作无效的可能性并加以防范。当一个人编写一个交换世界状态的函数时,它可以从纯开始;但是,必须考虑无效请求的可能性。我相信在惯用的Clojure中,要想影响不幸的道路,只需抛出例外。因此,现在可能是纯函数的函数受到了副作用异常的影响。也许这是必然的

(try
  (swap! world update-game) ;possible exception here!
  (catch Exception e
    (>! err-chan e))
我的目标是将副作用推迟到最后一刻。我几乎并没有涉足哈斯克尔的土地,但我知道这两种单子的概念。当一个人思考时,他就会明白,总有这两种可能性。这让我想到
交换本身是不够的,因为它忽略了不愉快的路径。这是这个想法的精髓:

(swap-either! err-chan world update-game) ;update-game returns either monad

Clojure社区是否采用了处理异常的方法?

在这种情况下,我倾向于采用两种不同的方法。如果在单个位置更新状态,我倾向于:

(try
  (swap! world update-game) ;possible exception here!
  (catch Exception e
    (>! err-chan e) 
    world)  ;;  <--- return the world unchanged
user> (def a (atom 1))
#'user/a
user> (add-watch a :im-a-test (fn [_ _ _ new-state]
                                (if (even? new-state)
                                  (throw (IllegalStateException. "I don't like even numbers")))))
#object[clojure.lang.Atom 0x5c1dc37e {:status :ready, :val 1}]
user> (swap! a + 2)
3
user> (swap! a + 3)
IllegalStateException I don't like even numbers  user/eval108260/fn--108261 (form-init8563497779572341831.clj:2)