从概念上讲,似乎执行输出的计算与仅执行输入的计算有很大不同。从某种意义上讲,后者要纯净得多。

我想,有一种方法可以将程序的仅输入部分与可能实际写出的部分分开。

那么,为什么没有输入仅Monad?

有一个I monad(和一个O Monad,可以合并为IO Monad)为什么不起作用?

编辑:我主要是指输入是读取文件,而不是与用户交互。这也是我的用例,在这里我可以假设输入文件在程序执行过程中没有改变(否则,获得未定义的行为就可以了)。

最佳答案

我不同意布多兰的回答。的确,输入和输出都不是“纯”的,但是它们却有很大不同。批判IO作为单个“罪人箱”是非常有效的,其中所有效果都挤在一起,并且确实使确保某些属性更加困难。例如,如果您拥有许多只能从某些内存位置读取的功能,而这些功能永远不会导致这些位置被更改,那么很高兴知道您可以对它们的执行进行重新排序。或者,如果您有一个使用forkIO和MVars的程序,那么根据其类型,很高兴得知它也不会读取/ etc / passwd。

此外,除了堆叠的变压器以外,还可以以某种方式构成单声道效果。您不能用所有的monad来做到这一点(只是免费的monad),但是对于这种情况,这才是您真正需要的。例如,iospec软件包提供了一个纯粹的IO规范-它不会将读写分开,但确实会将它们与STM,MVars,forkIO,soforth等分开。

http://hackage.haskell.org/package/IOSpec

Data Types a la Carte文件中描述了如何干净地组合不同monad的关键思想(阅读量大,很有影响力,推荐不足等)。

关于haskell - 为什么Haskell没有I Monad(仅用于输入,与IO monad不同)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5032475/

10-16 05:38