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