Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure -&燃气轮机;遇到零/假返回时中断评估的运算符_Clojure - Fatal编程技术网

Clojure -&燃气轮机;遇到零/假返回时中断评估的运算符

Clojure -&燃气轮机;遇到零/假返回时中断评估的运算符,clojure,Clojure,我想通过一系列函数来执行输入,就像->操作符所做的那样。但是,如果任何函数返回nil/false,那么我希望中断计算并返回错误消息。如何做到这一点,有没有提供此功能的运算符/宏?试试这个: 从文件: (-?> "foo" .toUpperCase (.substring 1)) returns "OO" (-?> nil .toUpperCase (.substring 1)) returns nil 如果将->宏用作第二个示例,则肯定会得到NullPointerException

我想通过一系列函数来执行输入,就像->操作符所做的那样。但是,如果任何函数返回nil/false,那么我希望中断计算并返回错误消息。如何做到这一点,有没有提供此功能的运算符/宏?

试试这个: 从文件:

(-?> "foo" .toUpperCase (.substring 1)) returns "OO"
(-?> nil .toUpperCase (.substring 1)) returns nil

如果将
->
宏用作第二个示例,则肯定会得到
NullPointerException

clojure.algo.monads
中还有
maybe-m
单子。作为monads框架的一部分,它比
-?>
宏更重,因此如果您使用monads,或者如果您的计算图比简单的函数链更复杂,那么使用
maybe-m
是有意义的

与线程宏不同,
domonad
组合可以处理多个参数函数,这些函数从前面的多个计算步骤中获取参数:

(domonad maybe-m
    [a 1
     b nil
     c (* a b)]
    c)

在本例中,
(*ab)
不会得到计算,因为
b
为零。整个表达式将返回nil,而不是抛出一个试图乘以nil的异常。

谢谢Alexey,这正是我所需要的。为了完整性,让我们提到它位于主clojure jar中的
clojure.core.incubator
命名空间中。@AlexBaranosky请参阅OP.Sure的第一条注释,但他想要什么并不重要。他问什么很重要。几个月/几年后,阅读这个问题的人会感到困惑。从Clojure 1.5开始,它是由core提供的,名为
some->
maybe monad有点危险,因为它不使用任何和零的双关语。这违反了monad定律(),如果nil是计算中的有效值,则可能会导致问题。