假设我有这两个 F# 函数:
let sq x = x*x
let tm = DateTime.Now
显然 sq 是纯的,因为它总是为给定的输入返回相同的值,而 tm 是不纯的,因为每次调用它都会返回不同的值。
一般来说,有没有一种方法可以确定 F# 中的特定函数是纯函数还是不纯函数,而无需分析它的作用,换句话说,就是逐行读取它?
或者,有没有办法在编写函数时注释函数以告诉编译器该函数是纯函数还是不纯函数?
最后,当调用作为公共语言运行时一部分的函数(例如 DateTime)时,如何不尝试就判断它是纯函数还是不纯函数?
注意:“纯”是指来自维基百科的定义:http ://en.wikipedia.org/wiki/Pure_function (永久链接)
在计算机编程中,如果关于函数的以下两个陈述都成立,则可以将函数描述为纯函数:
给定相同的参数值,该函数始终评估相同的结果值。函数结果值不能依赖于任何可能随着程序执行或程序的不同执行而改变的隐藏信息或状态,也不能依赖于来自 I/O 设备的任何外部输入。
结果的评估不会导致任何语义上可观察的副作用或输出,例如可变对象的突变或输出到 I/O 设备。