macros - 在 Clojure 中,我们什么时候应该使用 monad 而不是宏,反之亦然?

标签 macros clojure monads

有太多关于 monad 的教程说......“看!这是一个我们可以使用 monad 的案例”或“这就是 monad 的用途”。我想知道的是人们用来得出他们可以对自己说的结论的一些步骤是什么 - “Gee Whiz!看起来我们可以在这里使用 monad!”

因此,当有人告诉我......“(废话)与 monad 无关......”,这真的无助于我回答我的问题,这些问题是:

  • 我如何确定可以使用 monad 表达程序中的哪种模式?
  • 当我确定了使用它们的潜力时,我该如何编写自己的定制 monad?

  • 如果有人有兴趣提供帮助,我在这里开始了一个关于 monad 的很长的问题 - Map and Reduce Monad for Clojure... What about a Juxt Monad? .

    回到这个问题:

    我们什么时候应该使用 monad 而不是宏,反之亦然?
  • 我读过一些文章并观看过这样的演讲……“Monads 用于 DSL 抽象”……但是大多数 Clojure DSL 库(例如 hiccup 和 korma)都在使用 defmacro而且效果很好。

  • 如果我们有宏,为什么我们需要 Clojure 中的 monad?

    最佳答案

    我已经使用 Clojure 两年了,我唯一一次使用 monad 是为了证明它可以完成。我从来不需要它们来编写“真正的”代码。

    Monad 在 Haskell 中更为常见,因为:

  • 它们是处理有状态计算的惯用方式。在 Clojure 中,您通常使用 managed references 处理状态,因此在 Clojure 中几乎不需要那么多 monad。
  • 同样对于 IO:Clojure 允许您直接执行 IO,而无需在您的类型中声明它,因此您不需要 IO monad。

  • 我的建议是专注于 Clojure 中的标准函数式编程。除非你看到你真的需要 monad,否则我不会花太多时间尝试引入它们。

    宏是一个稍微不同的问题:它们用于编译时代码生成和语言语法的扩展(可能包括 DSL,尽管 DSL 不一定需要宏)。当以下两种情况都为真时,我使用宏:
  • 我想以一种显着提高我解决特定问题域的能力的方式扩展语言语法。
  • 我无法通过普通函数/函数组合获得相同的功能。如果可能,普通函数应该是您的首选:它们通常更易于编写和维护。

  • 附言如果你真的对 Clojure 的 monad 感兴趣,这里有两个我个人觉得非常好的视频:
  • http://vimeo.com/20717301 (Brian Marick 对 monad 的出色视觉解释)
  • http://www.infoq.com/presentations/Monads-Made-Easy
  • 关于macros - 在 Clojure 中,我们什么时候应该使用 monad 而不是宏,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900114/

    相关文章:

    JavaScript 在 Firefox 的 iMacros 插件中的多个宏之间切换

    macros - 在 make 目标中设置 C 宏?

    java - Clojure STM ( dosync ) x Java 同步块(synchronized block)

    string - 在 Clojure(Script) 中按行字母顺序对字符串进行排序

    java - Scala Option.orElse 等效于 Java Optional

    c - c中的宏定义

    macros - 宏观卫生是否只在不同的模块中保护您?

    Clojure 递归和惰性序列

    json - 为Text.JSON的Result类型编写一个liftIO实例

    haskell - 将单子(monad)绑定(bind)到复合 Material 中(Haskell)