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

Haskell Monad与计算机程序的结构和解释,haskell,functional-programming,scheme,monads,sicp,Haskell,Functional Programming,Scheme,Monads,Sicp,当我搜索SICP第二版的书时,我找不到单词“Monad”。SICP的哪个概念(或章节)与单子有关?SICP中没有明确提到单子:这本书早在有人将单子的概念形式化为计算机编程之前就写好了(这里忽略单子的数学概念,这是另一回事)。但是,书中的一些内容无论如何都是单子的:例如,不管你是否知道列表是单子。SICP使用Scheme。方案允许将任意操作链接在一起。没有什么能阻止你这么做。换句话说,你基本上是在一个“做任何事”的单子里工作。此外,在Lisp这样的多范式语言中,它们往往没有那么有用或不太专业(我的

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

SICP中没有明确提到单子:这本书早在有人将单子的概念形式化为计算机编程之前就写好了(这里忽略单子的数学概念,这是另一回事)。但是,书中的一些内容无论如何都是单子的:例如,不管你是否知道列表是单子。

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

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

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

编辑1:第一段的澄清。您可以在Lisp(一种不纯语言)中使用单子,只是您没有确保不会混合效果的类型系统。我在一个
列表中使用了
IO
,也就是说,正如亚历克西斯·金所指出的那样,monad设计模式非常有用,就像
可能在Clojure/Racket中使用
List
一样


编辑2:对于像State和ST这样的东西(这可能是大多数用例中看到的,因为许多(大多数?)算法利用了可变性),monad实际上没有多大意义。另外,正如我已经指出的,在大多数Lisp中,Haskell并不能为您提供预期的保证。

Eugenio Moggi在1991年首次描述了单子在程序结构中的普遍使用。SICP于1984年出版。谢谢,但我指的是2005年出版的第二版,我更新了这个问题。第二版于1996年7月出版。一元I/O——第一个“广泛传播”的一元——于1996年5月出现在哈斯克尔。直到进入21世纪,单子才广为人知。我现在不明白当时我为什么投票结束这个问题。为了回答这个问题,我们在第四章“元语言抽象”和“解释者”。正因为Monad是解释器模式,程序和编写它们的方法是我们语言的第一类对象(数据和函数)。对Monads最好的介绍是Wadler的《如何将失败转化为成功列表》,其中一次(我想)没有提到M字(续)。尽管SICP的口译员不属于Monads语言。是否有其他书籍涵盖包括Monads在内的最新研究?如果有答案,你能更新你的答案吗?你错了。1991年,莫吉已经把他们从数学转到了计算机科学。SICP的第二版始于1996年。SICP根本不处理类型,更一般地说,他们不想谈论类型。但是,掌握SICP确实可以间接理解单子。-1,虽然Haskell确实使用单子进行I/O,但
IO
monad是唯一的“神奇”单子,即使在Scheme中,很多单子也是有用的。例如,Maybe monad以
some->
的形式进入Clojure。你的答案没有错(Scheme不使用单子作为抽象有很多原因),但第一段是一个糟糕的论点,有点误导。我想我提到的是Scheme,而不是Clojure(它非常倾向于FP;不过除了wiki文章外,我对它知之甚少)。这就是说,Scheme(好吧,Racket)确实允许您在单子中具有多重效果。我尝试在同样执行IO的列表monad中混合IO操作。因此,这并不像Haskell中那样是一个单子(sigs类型不匹配)。然而,我承认这种风格的构图在Scheme中也非常有用(尽管我只看到过maybe在任何地方付诸实施。