以下两个陈述给出了相同的结果:
(with-monad maybe-m
(domonad [a nil
b (+ 1 a)]
b)) ;; nil
(domonad maybe-m [a nil
b (+ 1 a)]
b) ;; nil
我对clojure,尤其是monad仍然很新,但我只想弄清楚在这种情况下有什么不同。
由于
答案 0 :(得分:3)
如果你看一下with-monad的定义,你会发现它所做的就是从作为第一个参数给出的monad中提取有意义的函数。
domonad是一个“语法suger”,可以让你在没有手动绑定和返回的情况下编写monadic操作。它实际上在内部使用with-monad来使用monads有意义的函数来计算exprs。
如果你只用两个参数调用domonad,就像你在第一个例子中所做的那样,它假设你已经在monad的上下文中,这意味着所有有意义的函数都可用。在你的第一个例子中,它们确实可用,因为你在调用之前使用with-monad使它们可用。 OTOH,如果你用三个参数调用它,就像你的第二个例子一样,它首先使用with-monad引入monad的上下文,然后继续评估绑定。
所以从本质上讲,这两个样本完全相同。