使用Lisp宏无法实现的Haskell monad可以做什么,反之亦然?

时间:2015-07-08 10:05:45

标签: haskell macros lisp monads

我目前的理解是宏可以实现任何可以想象的概念,包括monad,因为它们“手头有编译器”。这是真的?例如,我遇到了这个link

请给我一些事实和例子,没有热情的答案。谢谢。

2 个答案:

答案 0 :(得分:7)

这是一种奇怪的比较。这有点像要问柴油发电机不能用汽油车做什么?"呃,那些并不属于同一类......

Lisp宏[我几乎一无所知]允许你进行编译时元编程。您可以使用它来实现各种有用的东西,从消除一些样板代码到虚拟定义一种全新的编程语言。

Haskell monads是构造某些类型计算的有用方法。他们可以轻松地做某些本来有点繁琐的事情。 (例如,在运行下一个函数之前检查每个函数的结果以确保它成功。)所有这些都是运行时的东西;它与编译时代码生成无关。

答案 1 :(得分:3)

如果你可以用Lisp实现一些东西,你可以用宏来改进它的语法。因此宏部分只是为了让它看起来更好或/和减少代码大小。

您不需要宏来实现monad。 Marijn Haverbeke使用defstructdefgeneic制作了monad implementation

当然defstructdefgeneric可能会使用宏来实现它的魔力,但实际上并不需要实现monad。您可以使用闭包实现monad。在下面的代码中,它用作封装和消息传递的基本OO。

(defun maybe (val)
  (lambda (msg &optional f m)
    (case msg
      ((bind) (if val (funcall f val) m))
      (otherwise val))))

(defun bind (m f)
  (funcall m 'bind f m)) ;message passing

(defun value (m)
  (funcall m 'value))    ; message passig

宏是用于语法的函数。在像Haskell这样的惰性语言中,宏可以被函数替换,因为参数仅在需要时进行计算。例如。在急切评估的CL中,您需要一个宏来创建自己的if,但您可以使用Haskell中的函数执行相同的操作。