【发布时间】:2014-01-20 21:12:03
【问题描述】:
以下两个语句给出相同的结果:
(with-monad maybe-m
(domonad [a nil
b (+ 1 a)]
b)) ;; nil
(domonad maybe-m [a nil
b (+ 1 a)]
b) ;; nil
我对 clojure 尤其是 monad 还是很陌生,但我只是想弄清楚这种情况下的区别。
谢谢
【问题讨论】:
以下两个语句给出相同的结果:
(with-monad maybe-m
(domonad [a nil
b (+ 1 a)]
b)) ;; nil
(domonad maybe-m [a nil
b (+ 1 a)]
b) ;; nil
我对 clojure 尤其是 monad 还是很陌生,但我只是想弄清楚这种情况下的区别。
谢谢
【问题讨论】:
如果您查看 with-monad 的定义,您会发现它所做的只是从作为第一个参数给出的 monad 中提取有意义的函数。
domonad 是一个“语法糖”,让您无需手动绑定和返回即可编写一元操作。它实际上在内部使用 with-monad 来使用 monad 有意义的函数来评估 expr。
如果您只使用两个参数调用 domonad,就像您在第一个示例中所做的那样,它假定您已经处于 monad 的上下文中,这意味着所有有意义的函数都可用。在您的第一个示例中,它们确实可用,因为您在调用前使用 with-monad 使它们可用。 OTOH,如果您使用三个参数调用它,就像在第二个示例中一样,它首先使用 with-monad 引入 monad 的上下文,然后继续评估绑定。
所以本质上,这两个样本完全一样。
【讨论】: