Maybe Monad是您的功能代理的精髓吗?

时间:2014-09-26 13:26:11

标签: clojure proxy monads maybe

假设:

  • by proxy 我的意思是像Spring中的包装器一样
  • 通过你的功能我指的是像(fn [x] (+ x 1))
  • 这样简单的东西

考虑以下from 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的功能是您的功能代理吗?

2 个答案:

答案 0 :(得分:0)

Clojurians似乎更倾向于语法转换,例如some->线程宏用于nil上的短路,而不是像monad那样的代数形式。

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

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

答案 1 :(得分:0)

我不确定Spring包装器是如何工作的,但是那篇文章中描述的关于可能monad的观点是你编写这样的代码:

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

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

所以如果传入nil,你不会得到nil,但如果(inc 8)突然返回nil,它也会有效。