纯函数和I / O.

时间:2017-10-13 02:04:49

标签: functional-programming

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

我对执行I / O的函数何时以及为何被认为是不纯的时候有点模糊 -

I / O输入 - 如果函数的结果不依赖于I / O输入(例如用户输入或文件读取),它仍然会被认为是不纯的,为什么?

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

或者,我错过了什么......

2 个答案:

答案 0 :(得分:1)

纯函数必须是referentially transparent

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

  

I / O输入 - 如果函数的结果不依赖于I / O输入(例如用户输入或文件读取),它仍然会被认为是不纯的,为什么?

如果没有 - 那么只需删除任何IO读取。

  

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

它不会 - 因为副作用。

答案 1 :(得分:0)

  

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

它不再是纯粹的,因为副作用改变了世界"所以结果不是"相同"了。

改变世界的无害例子:在你的功能计算之前,你在屏幕上输出了2行。经过计算,有3个。

改变世界并不是一个无害的例子:当你的程序启动时(它使用你的"几乎纯粹的#34;函数很多),你的C:驱动器上有几千兆字节的自由空间。不幸的是,它是在输出重定向到C:驱动器上的某个文件的情况下启动的,几个小时后C:驱动器运行满了。这导致一些重要的会计工作的计划夜间运行失败。结果:您的公司在合适的时间没有一些重要的数字,而且损失了金钱。而你失去了工作。