【发布时间】:2015-04-22 14:44:12
【问题描述】:
我的问题是 Haskell 中的 monads 是否真的保持 Haskell 的纯洁性,如果是的话,如何保持。我经常读到副作用是不纯的,但有用的程序(例如 I/O)需要副作用。在下一句中,Haskell 对此的解决方案是 monads。然后在某种程度上解释了 monad,但并未真正解释它们如何解决副作用问题。
我见过this 和this,我对答案的解释实际上是在我自己的阅读中得到的——IO monad 的“动作”不是 I/O 本身,而是对象即在执行时执行 I/O。但我突然想到,可以为任何代码或任何已编译的可执行文件提出相同的论点。您不能说 C++ 程序只在编译代码执行时产生副作用吗?所有的 C++ 都在 IO monad 中,所以 C++ 是纯的?我怀疑这是真的,但老实说,我不知道它是不是真的。事实上,Moggi (sp?) 最初不是使用 monad 来为命令式程序的指称语义建模吗?
一些背景知识:我是 Haskell 和函数式编程的粉丝,我希望随着我的学习继续深入了解这两个方面。例如,我了解引用透明度的好处。这个问题的动机是我是一名研究生,我将在编程语言课上做 2 个 1 小时的演讲,一个特别涉及 Haskell,另一个涉及一般的函数式编程。我怀疑班上的大多数人都不熟悉函数式编程,也许看过一些方案。我希望能够(合理地)清楚地解释 monad 如何解决纯度问题,而无需进入范畴论和 monad 的理论基础,我没有时间介绍,而且我也不完全了解自己——当然不够好,无法展示。
我想知道这种情况下的“纯度”是否真的没有很好的定义?
【问题讨论】:
-
关于同一主题:The C language is purely functional Conal Elliot
-
嗯,IO 类型包含对“内部”语言的操作的描述,而从 C 程序生成的代码是语言本身的“外部”(因此代码是“纯”的,但不是语言。)
-
@chi 谢谢你的链接!我以前没见过。
-
为了了解这一切是如何一起发挥作用的,我发现阅读 Wadler/Peyton Jones 的“原始论文”Imperative Functional Programming 非常有帮助(并且可以理解)。
-
它与 C++ 的主要区别在于 事物默认不在 IO monad 中。