代码之家  ›  专栏  ›  技术社区  ›  G__

在Clojure中用于标识monad

  •  10
  • G__  · 技术社区  · 14 年前

    我一直在读 excellent introduction to monads for Clojure programmers . 文章说明了单子身份在功能上等同于Clojure的 序列/列表monad等价于 对于 .

    当本文讨论Monad Transformers时,它展示了一个结合了Maybe和Sequence Monad的示例。好的,所以使用序列monad而不是 对于 我可以改变它。然而,改变一个单子的身份对我来说是没有意义的——难道这不总是等同于建立一个无论是什么样的单子吗?例如,如果我改变了身份——这不是给了我一个可能吗,直接声明更容易吗?

    有人能弄清楚是否有实际用途吗 克洛伊尔 选择一个单子身份而不是 (也许我不是一直在思考变压器的含义?)或者只是为了理论上的完整性?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Michał Marczyk    14 年前

    一个很好的原因是,您可以编写一个不绑定到特定monad的单元函数,然后在 with-monad 块。 identity-m 如果你写作的话,你可以选择不涉及任何特殊的一元伏都教。 (with-monad identity-m ...) .

    (很明显,如果您的一元函数基本上使用了它所使用的monad的一些属性,例如getter和state setter的可用性等,那么这将不起作用。但是,并非所有的一元函数都是这样的。)

        2
  •  8
  •   Gijs    14 年前

    事实上,单子身份在单子变压器中是非常有用的基础。例如,也许Monad Transformer(也许-t)只允许nil以外的值:

    1:2 => (use 'clojure.contrib.monads)
    nil
    1:3 => (domonad maybe-m [a 1 b 2] (+ a b))
    3
    1:4 => (domonad maybe-m [a 1 b nil] (+ a b))
    nil
    ;; Domain uses the :fail keyword as the nil value:
    1:6 => (domonad (maybe-t identity-m :fail) [a 1 b :fail] (+ a b))
    :fail
    

    请注意,使用maybe-m作为基础monad将在fail和nil上实现快捷方式,而不仅仅是fail。

    推荐文章