抱歉,如果这个问题没有任何意义。
我目前正在编写一个小型应用程序,我想将一些函数“链接”在一起,形成更广泛的计算。
例如,我有一个函数,它调用 Web 服务并返回 hash-map
作为结果,如果出现错误或出现问题,则返回 nil
。链中的下一个函数获取映射并进行一些进一步的处理,然后将其传递给下一个函数......依此类推。
问题是,如果第一个函数失败,它将把 nil
传递给下一个函数,这将抛出一个空指针(或其他),我什至不希望它达到这个阶段。
因此,换句话说,如果链中的一项失败,我希望整个计算失败。
例如
;successful computation = function1 returns W -> function2 returns X -> function3 returns Y -> function4 returns Z -> Z
;failed computation = function1 returns W -> function2 returns X -> function3 returns nil -> nil
(-> (function1 "http://webservice.com") (function2) (function3) (function4))
问题是我不想在开始时用 if(nil?arg)
乱扔我的每个函数,理想情况下我想要一个可以处理这个问题的抽象我,但我不太了解 Clojure 中可用的内容
我正在考虑采用 Scala 风格的 Option
类型,可以是 Some(value)
或 None
但我仍然需要在开始时用这些检查乱扔我的代码
任何想法或回复将不胜感激
最佳答案
Clojure Contrib的algo.monad
包括 Scala 调用 Option
的 monad 实现。它被称为 maybe-m
并通过将 nil
视为 None
来工作。您可以像这样使用它:
(ns mulk.monads-test
(:refer-clojure)
(:use clojure.repl
clojure.algo.monads))
(defn function1 [x]
x)
(defn function2 [x]
(+ x 10))
(defn function3 [x]
(* x 2))
(defn calc-stuff [thing]
(domonad maybe-m
[x1 (function1 thing)
x2 (function2 x1)
x3 (function3 (+ x2 10))]
x3))
(calc-stuff 10) ;=> 60
(calc-stuff nil) ;=> nil
关于clojure - 程序流程 - 如果一次计算失败则停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121824/