【问题标题】:Monad and Structure and interpretation of computer programs [closed]Monad和计算机程序的结构和解释[关闭]
【发布时间】:2016-04-01 23:38:01
【问题描述】:

我在搜索 SICP 2nd Edition 书籍时找不到“Monad”这个词。 SICP 的哪个概念(或章节)与 Monad 相关?

【问题讨论】:

  • Eugenio Moggi 在 1991 年首次描述了 monad 用于构建程序的一般用途。SICP 于 1984 年出版。
  • 谢谢,但我的意思是 2005 年的第二版,我更新了问题。
  • 第二版于 1996 年 7 月出版。Monadic I/O——第一个“广泛”的 monad——于 1996 年 5 月出现在 Haskell 中。直到 21 日,Monad 才广为人知世纪。
  • 我现在不明白为什么我当时投票结束这个问题。要回答它,这是第 4 章,“元语言抽象”IOW“解释器”。仅仅因为 Monad 解释器模式,其中程序和组合它们的方法是我们语言的第一类对象(数据和函数)。 Monads 最好的介绍是 Wadler 的“如何将失败转化为成功列表”,其中一次没有提到 M 字(我认为)。
  • (续)尽管 SICP 的口译员是该语言的外部

标签: haskell functional-programming scheme monads sicp


【解决方案1】:

SICP 中没有任何内容明确涉及 monad:这本书早在任何人将 monad 的概念正式化之前就写好了,因为它与计算机编程相关(这里忽略了 monad 的数学概念,这是另一回事)。但是,无论如何,书中的某些内容是单子的:例如,无论您是否知道,列表都是单子。

【讨论】:

  • 是否有任何替代书籍涵盖包括单子在内的最新研究?如果有的话,你能更新你的答案吗?
  • 你错了。 person.dibris.unige.it/moggi-eugenio Moggi 已经在 1991 年将他们从数学转移到计算机科学。SICP 的第 2 版可以追溯到 1996 年。SICP 根本不应对,更一般地说,他们不想谈论类型。但确实掌握了 SICP 你间接地理解了 monad。
【解决方案2】:

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

在 Haskell 中,您编写程序,其中类型限制了可以在所述函数中发生的操作类型。使实例单子可以让您组合具有一些限制的函数(关于类型,以及程序员必须注意的单子法则)。您还可以使用转换器叠加效果。

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

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

编辑 2:对于像 State 和 ST 之类的东西(这可能是您在大多数用例中看到的,因为许多(大多数?)算法都利用了可变性),monad 并没有多大意义。此外,正如我已经指出的那样,在大多数 Lisps 中,您无法从 Haskell 中获得预期的保证。

【讨论】:

  • -1,虽然 Haskell 确实将 monad 用于 I/O,但 IO monad 是唯一的“神奇” monad,即使在 Scheme 中也有很多 monad 有用。例如,Maybe monad 以 some-> 的形式进入 Clojure。您的回答没有错(Scheme 不使用 monad 作为抽象的原因有很多),但是第一段的论点很差,而且有点误导。
  • 我以为我提到了 Scheme,而不是 Clojure(它非常倾向于 FP;不过,除了 wiki 文章之外,我对此知之甚少)。也就是说,Scheme(好吧,Racket)确实允许您在 monad 中具有多种效果。我尝试在执行 IO 的 list monad 中混合 IO 操作。所以,因此,这并不是一个真正的 monad,因为它在 Haskell 中是这样的(类型 sigs 不匹配)。但是,我承认这种组合风格在 Scheme 中也非常有用(尽管我只在任何地方看到过可能付诸行动。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多