假设我有这两个 F# 函数:
let sq x = x*x
let tm = DateTime.Now
显然 sq 是纯的,因为它对于给定的输入总是返回相同的值,而 tm 是不纯的,因为每次调用它时都会返回不同的值。
一般来说,有没有一种方法可以确定 F# 中的特定函数是纯函数还是不纯函数,而无需分析它的功能,换句话说,逐行读取它?
或者,有没有一种方法可以注释函数,以在编写函数时告诉编译器该函数是纯函数还是不纯函数?
最后,当调用公共语言运行时的函数(例如 DateTime)时,如何在不尝试的情况下判断它是纯函数还是不纯函数?
注意:“纯粹”是指维基百科的定义:http://en.wikipedia.org/wiki/Pure_function http://en.wikipedia.org/wiki/Pure_function ()
在计算机编程中,如果满足以下条件,则可以将函数描述为纯函数:
关于该函数的这些陈述成立:
给定相同的参数,该函数始终计算相同的结果值
值。函数结果值不能依赖于任何
隐藏的信息或状态可能会随着程序执行而改变
进行或在程序的不同执行之间,也不可以
取决于来自 I/O 设备的任何外部输入。
对结果的评估不会引起任何语义上可观察的方面
效果或输出,例如可变对象的突变
或输出到 I/O 设备。
F# 不提供任何用于检查方法是否纯的功能和工具,因此一个简单的答案是您必须自己检查此属性。
在 F# 之外,值得注意的是代码合约 http://msdn.microsoft.com/en-us/library/dd264808.aspx库有纯方法的概念(它们可以用PureAttribute http://msdn.microsoft.com/en-GB/library/system.diagnostics.contracts.pureattribute.aspx),但我不完全确定那里的检查故事是什么。我认为代码契约附带了分析 IL 的静态检查器(并且也应该适用于 F#),但这是一项相当困难的任务,所以我预计它会受到很大的限制。但是,那PureAttribute
用于某些 BCL 方法,因此您可以看出某些标准 .NET 方法是纯方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)