clojure - 程序流程 - 如果一次计算失败则停止运行

标签 clojure

抱歉,如果这个问题没有任何意义。

我目前正在编写一个小型应用程序,我想将一些函数“链接”在一起,形成更广泛的计算。

例如,我有一个函数,它调用 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 Contribalgo.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/

相关文章:

clojure - cljc单文件宏定义可以与clojurescript一起使用吗?

javascript - (node/enable-util-print!) 是做什么的?

clojure - Clojure Core 或 Contrib 中是否有等效的 Zip 函数?

exception - 如何访问 `clojure.lang.Compiler$CompilerException`实例的行变量?

Clojure 泛音(按命令)

java - Java 序列化 Clojure 数据结构的大小

c# - 是否可以在 Xamarin 中将 Clojure CLR 与 C# 一起使用?

clojure - 为什么 `read`返回一个字符串,而 `read-line`返回一个符号

clojure - 您如何为 Leiningen 配置专有依赖项?

clojure - 在宏中创建命名空间限定函数名称