Haskell被称为"纯函数式语言".
在这种情况下,"纯粹"意味着什么?这对程序员有什么影响?
我已经将IO monad描述为状态monad,状态是"现实世界".这种IO方法的支持者认为,这使IO操作变得纯粹,就像在引用透明时一样.这是为什么?从我的角度来看,IO monad中的代码似乎有很多可观察到的副作用.此外,是不是可以描述几乎任何非纯函数,如现实世界的功能?例如,我们不能想到,比方说,C的malloc是一个函数,它接受一个RealWorld和一个Int并返回一个指针和一个RealWorld,就像在Realmonorld隐含的IO monad中一样?
注意:我知道monad是什么以及它是如何使用的.请不要回复随机monad教程的链接,除非它专门解答我的问题.
在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?
编辑:
这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.
此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.
monads haskell functional-programming referential-transparency
从概念上讲,执行输出的计算似乎与仅执行输入的计算非常不同.从某种意义上说,后者更为纯粹.
举个例子,我希望有一种方法可以将我的程序中仅输入的部分与可能实际写出的部分分开.
那么,为什么只有Monad没有输入?
任何原因导致I monad(以及可以合并到IO Monad中的O Monad)的任何原因?
编辑:我主要是指输入为阅读文件,而不是与用户交互.这也是我的用例,我可以假设输入文件在程序执行期间不会改变(否则,可以获得未定义的行为).
IO monad实际上是如何实现的?在意义上,该main函数的实际实现是什么?
我如何从另一种语言调用haskell函数(IO),在这种情况下,我是否需要维护IO自己?
是否main将IO操作(Lazily)作为引用拉出然后调用它们?或者它是解释工作,当它发现它可以调用它们的方式的行动?或者别的什么?
有不同语言的IO monad实现是否有助于深入理解主要功能中发生的事情?
编辑:
这hGetContents让我很困惑,让我不确定IO是如何真正实现的.
好吧,假设我有一个非常简单的纯Haskell解释器,不幸的是没有IO支持,并且为了好奇,我想向它添加这个IO动作(unsafeIO技巧也).很难从GHC,Hugs或其他人那里得到它.
在学习Haskell时,我感觉作者并不总是告诉我一切,所以要真正理解它,我想知道类型系统背后的理论,monad和类似的概念.
大多数这些概念来自我听说过的类别理论,那么关于这个主题和相关主题的一些好书或网站是什么?