Monad和计算机程序的结构和解释

时间:2015-12-28 05:31:31

标签: haskell functional-programming scheme monads sicp

当我搜索SICP第2版的书时,我找不到“Monad”这个词。 SICP的哪些概念(或章节)与Monad有关?

2 个答案:

答案 0 :(得分:5)

SICP中没有任何内容明确地解释monad:这本书是在任何人将monad的概念形式化之前很久才编写的,因为它与计算机编程有关(忽略monad的数学概念,这是另一回事)。但是,书中的一些东西无论如何都是monadic:例如,无论你是否知道,列表都是monad。

答案 1 :(得分:1)

SICP使用Scheme。 Scheme允许将任意动作链接在一起。没有什么能阻止你这样做。换句话说,你基本上是在做任何monad的工作。而且,在像Lisp这样的多范式语言中,它们往往不是那么有用或不具有这种语言(我认为,Scheme并不偏袒任何一方;它通过使用后缀禁止突变来避免变异,&#34 ;!"。)

在Haskell中,您编写的程序类型限制了在所述函数中可能发生的操作类型。使一个实例monadic允许你组合函数有一些限制(关于类型,以及程序员必须处理的monad定律)。你可以使用变形金刚叠加效果。

因此,monad在像Scheme这样的语言设置中没有那么有用。正如Amalloy正确地说的那样,他们当时也没有发明过它们。

编辑1:对第一段的澄清。你可以在Lisp中使用monad(一种不纯的语言),只是你没有类型系统来确保你没有混合效果。我在IO monad(Racket + functional / better-monads)中使用了List这就是说,monad设计模式非常有用,就像使用MaybeList一样正如亚历克西斯·金指出的那样,在Clojure / Racket中。

编辑2:对于像State和ST这样的东西(你可能会在大多数用例中看到很多(大多数?)算法利用可变性),monads真的没有多大意义。另外,正如我已经指出的那样,在大多数Lisps中,你没有得到你对Haskell的保证。