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



当我搜索SICP第二版时,找不到单词"Monad"。SICP的哪个概念(或章节)与莫纳德有关?

SICP中没有任何内容明确提到monad:这本书早在任何人正式化monad的概念之前就已经写了,因为它与计算机编程有关(这里忽略了monad的数学思想,这是另一回事)。但是,书中的一些东西无论如何都是一元的:例如,无论你是否知道,列表都是一个一元的。

SICP使用Scheme。Scheme允许将任意操作链接在一起。没有什么能阻止你这么做。换句话说,你基本上是在做任何事情的单子上工作。此外,在Lisp这样的多范式语言中,它们往往没有那么有用或idomatic(我的意思是Scheme不偏袒任何一方;它通过使它们成为后缀"!"的禁忌来避免突变)。

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

因此,monad在Scheme这样的语言环境中并没有那么有用。正如Amalloy正确地说的那样,它们也不是当时发明的。

第1版:对第一段的澄清。你可以在Lisp(一种不纯的语言)中使用monad,只是你没有确保你没有混合效果的类型系统。我在List monad中使用了IO(Racket+functional/better monad)。也就是说,正如Alexis King所指出的,monad设计模式可能非常有用,就像在Clojure/Racket中使用MaybeList一样。

第2版:对于State和ST(这可能是你在大多数用例中看到的,因为许多(大多数?)算法都利用了可变性)之类的东西,monad实际上没有多大意义。此外,正如我已经指出的,在大多数Lisp中,您并不能从Haskell中得到您所期望的保证。

最新更新