0

假设:

  • 通过代理,我的意思是像 Spring 中的包装器
  • 通过你的功能,我的意思是简单的(fn [x] (+ x 1))

考虑来自 Konrad Hinsen的以下内容:

(defn f [x]
  (let [a  x
        b  (inc a)]
    (* a b)))

(defn f [x]
  (domonad maybe-m
    [a  x
     b  (inc a)]
    (* a b)))

(defn m-bind [value function]
  (if (nil? value)
      nil
      (function value)))

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

我的问题是:Maybe Monad 的本质是您功能的代理吗?

4

2 回答 2

0

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

(defn f [x]
  (domonad maybe-m
    [a  x
     b  (inc a)]
    (* a b)))

monad 机制在行之间添加了检查。因此,在每个语句之后,它都会检查结果是否为 nil,如果是,则返回 nil 并退出。

因此,如果您传入 nil,您不仅会得到 nil,而且如果(inc 8)突然返回 nil,它也可以工作。

于 2014-09-26T14:26:11.827 回答
0

Clojurians 似乎更喜欢句法转换,例如some->用于短路 on 的线程宏nil,而不是像 may 单子这样的代数形式。

在任何一种情况下,无论是通过代码转换还是通过一元结构,关键是操纵延续,以便在遇到nilor之后永远不会调用它Nothing

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

于 2014-09-26T14:03:46.607 回答