35

monads被描述为处理IO的haskell解决方案。我想知道是否还有其他方法可以用纯函数式语言处理 IO。

4

7 回答 7

37

纯函数式语言中 I/O 的 monad 有哪些替代方案?

我知道文献中有两种选择:

  • 一种是所谓的线性系统。这个想法是线性类型的值必须只使用一次:你不能忽略它,也不能使用它两次。考虑到这个想法,你给世界的状态一个抽象类型(例如,World),然后你让它成为线性的。如果我用星号标记线性类型,那么这里是一些 I/O 操作的类型:

    getChar :: World* -> (Char, World*)
    putChar :: Char -> World* -> World*
    

    等等。编译器安排确保您永远不会复制世界,然后它可以安排编译更新世界的代码,这是安全的,因为只有一个副本。

    Clean语言中的唯一性是基于线性的。

    这个系统有几个优点;特别是,它不会对 monad 所做的事件强制执行总排序。它还倾向于避免IO您在 Haskell 中看到的“罪箱”,在这种情况下,所有有效的计算都被扔进IOmonad,无论您是否想要全序,它们都得到全序。

  • 我知道的另一个系统早于 monads 和 Clean 并且基于这样的想法,即交互式程序是从(可能无限)请求序列到(可能无限)响应序列的函数。这个被称为“对话”的系统简直就是编程的地狱。没有人会错过它,也没有什么特别值得推荐的。Wadler 和 Peyton Jones在介绍 monadic I/O(命令式函数式编程的论文中很好地列举了它的错误。这篇论文还提到了一个基于延续的 I/O 系统,它是由 Yale Haskell 小组引入的,但寿命很短。

于 2010-01-28T22:55:59.310 回答
8

除了线性类型,还有效果系统

于 2010-02-07T07:30:33.747 回答
5

如果您对函数式 IO 感兴趣,那么 Peyton Jones 和 Wadler 的命令式函数式编程是必读的。他们讨论的其他方法是:

  • 对话是响应和请求的惰性流

type Dialogue = [Response] -> [Request]

main :: Dialogue

  • 延续 - 每个 IO 操作都将延续作为参数

  • 线性类型 - 类型系统以一种无法复制或破坏外部状态的方式限制您,这意味着您不能两次调用具有相同状态的函数。

于 2010-01-28T22:53:04.830 回答
5

Clean中使用了唯一性类型

于 2010-01-28T21:31:53.923 回答
5

如果“纯”是指“引用透明”,也就是说,应用的函数可以与其评估结果自由互换(因此每次调用具有相同参数的函数都有相同的结果),任何有状态 IO 的概念根据定义几乎被排除在外。

我知道有两种粗略的策略:

  • 让一个函数做 IO,但要确保它永远不能用完全相同的参数调用两次;这通过让函数简单地“引用透明”来回避这个问题。

  • 将整个程序视为一个纯函数,将“接收的所有输入”作为参数并返回“产生的所有输出”,两者都由某种形式的惰性流表示以允许交互。

有多种方法可以实现这两种方法,也有一定程度的重叠——例如,在第二种情况下,在 I/O 流上运行的函数不太可能在流的同一部分被调用两次。哪种方式更有意义取决于该语言为您提供的支持类型。

在 Haskell 中,IO是一种通过代码自动线程化顺序状态的 monad(类似于功能纯Statemonad),这样,从概念上讲,每次调用一个原本不纯的函数都会获得不同的隐含“外部世界状态”值”。

我知道的另一种流行的方法使用类似线性类型的东西来达到类似的目的。通过具有无法复制或复制的值来确保不纯函数永远不会两次获得相同的参数,从而无法保留和重用“外部世界状态”的旧值。

于 2010-01-28T21:46:22.767 回答
3

功能响应式编程是另一种处理此问题的方法。

于 2014-05-29T18:10:57.163 回答
1

我想知道是否还有其他方法可以用纯函数式语言处理 IO。

只需在此处添加其他答案:

  • 这篇论文的标题说明了一切:-)
  • 您还可以查看:

Rebelsky SA (1992) I/O 树和交互式惰性函数式编程。在:Bruynooghe M., Wirsing M. (eds) 编程语言实现和逻辑编程。PLILP 1992。计算机科学讲义,第 631 卷。Springer,柏林,海德堡

  • 当 Haskell 还年轻时,Lennart Augustsson 曾写过使用系统令牌作为 I/O 的机制:

L.奥古斯特森。使用系统令牌的功能性 I/O。PMG 备忘录 72,查尔姆斯理工大学计算机科学系,S-412 96 Göteborg,1989 年。

我还没有找到在线副本,但我没有迫切需要,否则我建议联系查默斯的图书馆。

于 2020-06-04T23:18:43.213 回答