Today()是一个不纯函数,因为它的结果取决于您不给它的东西;具体来说,当前系统时间。因此,当仅基于调用时提供的输入时,其结果是不确定的。
一个纯函数将是int Add(int a, int b) {return a + b;}
。该函数仅使用给出的函数,不使用其他外部状态数据。这样的自然结果是,您可以Add(2,2)
从现在到时间结束并获得4。另外,由于该函数不会更改任何外部状态(它没有“副作用”),所以从现在到时间结束,Add()ing 2和2不会更改系统中的其他任何内容,除非您随后将函数的结果分配给变量,或者使用该值更新状态(这不是函数本身执行的操作)。实际上,所有经典数学运算都是纯函数,因此可以实现。
另一方面,Today()连续两次调用时可能会产生相同的值,但是如果连续几天调用则不会产生相同的值。这是因为它依赖于外部状态数据,而外部状态数据不是您作为函数的参数提供的。结果,在程序范围内无法控制Today()函数的结果。它将在给定的日期产生给定的值,并且在任何一天都不会产生该值,除非您更改运行它的计算机的系统时钟(通常发生在程序范围之外的更改)。
函数不纯不一定是一件坏事。即使使用功能语言,也需要不纯函数才能与程序边界之外的任何事物进行交互,例如数据存储,通信管道,UI显示,外围设备等。不执行任何这些操作的程序就是程序其实用性受到极大限制;我什至可以称其为琐碎的程序,因为如果没有任何手段来接受输入或以任何方式将其输出告知您,它可能什么也没做。用功能语言编写的程序只能具有运行时提供的输入,并且可以向运行时报告输出,而无需任何明确定义的不正确方法,但这是因为运行时将所有在不完美的计算机系统中工作的所有不正确的细节抽象化了,
知道您正在使用的哪些函数是纯函数而哪些不是纯函数,这是一件非常好的事情,这样您就可以对如何使用它们做出正确的决定。不纯函数,因为它们会执行某些操作或依赖于从其用法中不明显的事物,所以仅在了解用法后,它们的行为可能无法预测。为了使使用该功能的系统处于一致状态,从而期望获得确定性的结果,需要进一步了解该功能的用途,以及从外部状态执行或需要向外部状态执行的操作。