这两个domonad may-m语句之间有什么区别?

时间:2014-01-20 21:12:03

标签: clojure monads

以下两个陈述给出了相同的结果:

(with-monad maybe-m
  (domonad [a nil
           b (+ 1 a)]
    b)) ;; nil

(domonad maybe-m [a nil
          b (+ 1 a)]
  b) ;; nil

我对clojure,尤其是monad仍然很新,但我只想弄清楚在这种情况下有什么不同。

由于

1 个答案:

答案 0 :(得分:3)

如果你看一下with-monad的定义,你会发现它所做的就是从作为第一个参数给出的monad中提取有意义的函数。

domonad是一个“语法suger”,可以让你在没有手动绑定和返回的情况下编写monadic操作。它实际上在内部使用with-monad来使用monads有意义的函数来计算exprs。

如果你只用两个参数调用domonad,就像你在第一个例子中所做的那样,它假设你已经在monad的上下文中,这意味着所有有意义的函数都可用。在你的第一个例子中,它们确实可用,因为你在调用之前使用with-monad使它们可用。 OTOH,如果你用三个参数调用它,就像你的第二个例子一样,它首先使用with-monad引入monad的上下文,然后继续评估绑定。

所以从本质上讲,这两个样本完全相同。