Clojure Maybe Monad的本质是函数的代理吗?

Clojure Maybe Monad的本质是函数的代理吗?,clojure,proxy,monads,maybe,Clojure,Proxy,Monads,Maybe,假设: 我所说的代理是指像春天一样的包装 我指的是像fn[x]+x1这样简单的函数 考虑以下几点: 现在的好处是,如果值为nil,那么m-bind返回nil,并且永远不会调用剩余的计算 我的问题是:Maybe Monad的本质是你函数的代理吗?Clojuris人似乎更喜欢语法转换,比如用于nil短路的some->threading宏,而不是像Maybe Monad这样的代数形式 在这两种情况下,无论是通过代码转换还是通过一元结构,键都在操纵延续,以便在遇到nil或Nothing后永远不会调用它

假设:

我所说的代理是指像春天一样的包装 我指的是像fn[x]+x1这样简单的函数 考虑以下几点:

现在的好处是,如果值为nil,那么m-bind返回nil,并且永远不会调用剩余的计算


我的问题是:Maybe Monad的本质是你函数的代理吗?

Clojuris人似乎更喜欢语法转换,比如用于nil短路的some->threading宏,而不是像Maybe Monad这样的代数形式

在这两种情况下,无论是通过代码转换还是通过一元结构,键都在操纵延续,以便在遇到nil或Nothing后永远不会调用它


仅仅在链中的每个函数上使用纯单个函数包装器无法实现这种短路行为,因为它们是纯的。您需要控制计算链本身,这可以通过宏进行代码转换,也可以通过monad安装延拓代数来完成。

我不确定Spring包装器是如何工作的,但文章中描述的maybe monad的要点是,您可以这样编写代码:

(defn f [x]
  (domonad maybe-m
    [a  x
     b  (inc a)]
    (* a b)))
monad机制在行之间添加检查。因此,在每一条语句之后,它检查结果是否为nil,如果是,则返回nil并退出


所以,如果你通过了nil,你不仅会得到nil,如果inc8突然返回nil,它也会起作用。

你能重新表述这个问题吗?你到底在问什么,代理,还有你的函数?我还是不知道代理是什么,因为我不知道Spring。你能详细说明一下吗?我的意思是,如果没有副作用,你不能在单独的包装器之外改变非本地程序流。纯函数在其作用域之外没有影响。当然,你可以用纯函数来实现这一点,但是它们必须像单子一样包装计算链。
(defn f [x]
  (domonad maybe-m
    [a  x
     b  (inc a)]
    (* a b)))