Functional programming 纯函数与I/O

Functional programming 纯函数与I/O,functional-programming,Functional Programming,我一直在阅读函数式编程,我理解纯函数和不可变对象的概念,以及它们为什么应用于函数式编程 我对执行I/O的函数何时以及为什么会被视为不纯有点模糊: I/O输入-如果函数的结果不依赖于I/O输入,如用户输入或文件读取,是否仍会被视为不纯,为什么 I/O输出-如果我的纯函数有几个警报或几个系统输出,但总是为同一个参数返回相同的结果,它仍然会被视为不纯净吗?为什么 还是我遗漏了什么?纯函数必须是 任何涉及IO的函数都不是引用透明的,因为它的调用不能用返回的结果替换 I/O输入-如果函数的结果不依

我一直在阅读函数式编程,我理解纯函数和不可变对象的概念,以及它们为什么应用于函数式编程

我对执行I/O的函数何时以及为什么会被视为不纯有点模糊:

  • I/O输入-如果函数的结果不依赖于I/O输入,如用户输入或文件读取,是否仍会被视为不纯,为什么

  • I/O输出-如果我的纯函数有几个警报或几个系统输出,但总是为同一个参数返回相同的结果,它仍然会被视为不纯净吗?为什么

还是我遗漏了什么?

纯函数必须是

任何涉及IO的函数都不是引用透明的,因为它的调用不能用返回的结果替换

I/O输入-如果函数的结果不依赖于I/O输入,如用户输入或文件读取,是否仍会被视为不纯,为什么

如果没有,则只需删除任何IO读取

I/O输出-如果我的纯函数有几个警报或几个系统输出,但总是为同一个参数返回相同的结果,它仍然会被视为不纯净吗?为什么

不会的,因为有副作用

I/O输出-如果我的纯函数有几个警报或几个系统输出,但总是为同一个参数返回相同的结果,它仍然会被视为不纯净吗?为什么

它不再纯粹,因为副作用改变了“世界”,所以结果不再“相同”

改变世界的无害示例:在函数计算之前,屏幕上有两行输出。经计算,共有3个


这不是一个无害的改变世界的例子:当你的程序启动时(它经常使用你的“几乎纯”的函数),你的C:驱动器上有几GB的空闲空间。不幸的是,它是在输出重定向到C:drive上的某个文件时启动的,几个小时后C:drive就满了。这导致某个重要Accounting作业的计划夜间运行失败。结果:你的公司在适当的时候手头没有一些重要的数字,所以它赔钱了。您失去了工作。

“I/O输入-如果函数的结果不依赖于I/O输入”-那么它为什么需要任何输入?此外,“输入”对您意味着什么?函数是否等待用户输入某个内容?函数是否消耗输入缓冲区(从而改变它)?我在这里使用的输入是读取文件或输入流或stdin。“I/O输出-如果我的纯函数有几个系统输出,但总是返回相同的结果”-那么它可能被认为是纯的,这取决于您当前正在推理的系统的哪些部分。在一台真正的机器上计算一个函数总是涉及到状态变化(在RAM、CPU等中),您可能关心或不关心这些变化。如果您的程序无法观察自己的输出,那么您确实可以忽略它。例如,将调试器或探查器挂接到您的程序将使其输出一些日志数据,但您的函数保持纯净。@programmeravi:读取文件不应改变任何状态(取决于您的操作系统),因此,当您不使用您所读取的内容时,您可以(也应该)在不更改任何内容的情况下忽略读取内容,人们甚至可以认为程序是纯的,即使没有影响的阅读。然而,从流(包括stdin)读取数据确实会消耗数据,使其他读卡器无法使用数据,并推进源代码,因此,它同时也是一种输出形式,即使您将读取的数据扔掉,也不能认为是纯粹的。因此,从您的回答来看,bergi,似乎只有在共享资源(如CPU/内存或其他线程能够观察到的某个全局共享对象)的状态中存在可观察的影响时,I/O才会使函数变得不纯——但我读到的关于纯函数与函数编程的文献中没有一篇能证明这一点。。。一个巨大的缺失点应该被澄清,对吗?另外,关于引用透明性,您有什么要说的吗(见下文)——如果函数执行的I/O不可见,是否会受到影响?