gpt4 book ai didi

haskell - 为什么 Haskell 没有 I Monad(仅用于输入,与 IO monad 不同)?

转载 作者:行者123 更新时间:2023-12-02 06:15:39 24 4
gpt4 key购买 nike

从概念上讲,执行输出的计算似乎与仅执行输入的计算有很大不同。从某种意义上说,后者更为纯粹。

我希望有一种方法将程序中仅输入的部分与可能实际写出内容的部分分开。

那么,为什么没有输入只有 Monad 呢?

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

编辑:我主要是将输入视为读取文件,而不是与用户交互。这也是我的用例,我可以假设输入文件在程序执行期间不会更改(否则,获得未定义的行为也没关系)。

最佳答案

我不同意 bdonlan 的回答。确实,输入和输出都不是更“纯粹”,但它们有很大不同。将 IO 批评为所有效果都挤在一起的单一“罪孽箱”是非常正确的,而且它确实使确保某些属性变得更加困难。例如,如果您有许多函数,您知道这些函数只能从某些内存位置读取,并且永远不会导致这些位置发生更改,那么如果您知道可以重新排序它们的执行顺序,那就太好了。或者,如果您有一个使用 forkIO 和 MVar 的程序,那么最好根据其类型知道它不会读取/etc/passwd。

此外,除了堆叠变压器之外,还可以以一种方式组合单子(monad)效果。您无法对所有 monad(仅免费monad)执行此操作,但对于这样的情况,这就是您真正需要的。例如,iospec 包提供了纯粹的 IO 规范——它不区分读取和写入,但确实将它们与 STM、MVars、forkIO 等分开。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com