假设我有这两个F#函数:
let sq x = x*x
let tm = DateTime.Now
很明显,sq是纯的,因为它总是为给定的输入返回相同的值,而tm是不纯的,因为每次调用它时,它都会返回不同的值。
通常,是否有一种方法可以确定F#中的某个特定函数是纯的还是不纯的,而不需要分析它所做的事情,换句话说,就是逐行读取它?
或者,是否有一种方法来注释一个函数,以便在编写函数时告诉编译器该函数是纯的还是不纯的?
最后,当调用作为公共语言运行库(如DateTime)一部分的函数时,如何才能不尝试就知道它是纯的还是不纯的?
注:我所说的“纯”是指维基百科的定义:函数 (permalink)
在计算机编程中,如果这两种有关函数的语句都成立,则可以将函数描述为纯函数:
发布于 2013-04-08 09:48:01
F#没有提供任何功能和工具来检查方法是否是纯的,所以一个简单的答案是您必须亲自检查这个属性。
在F#之外,值得注意的是,代码契约库有一个纯方法的概念(可以用PureAttribute
标记它们),但我不完全确定检查的内容是什么。我认为代码契约带有静态检查器来分析IL (并且应该也适用于F# ),但是这是相当困难的任务,所以我认为它是非常有限的。但是,PureAttribute
在一些BCL方法上使用,因此可以看出一些标准的.NET方法是纯的。
发布于 2013-04-08 11:40:20
从技术上讲,您的tm值不是一个函数,而是DateTime类型的值,并且它是不可变的,所以每次在创建这个值之后对它进行评估时都是相同的。
发布于 2013-04-09 03:52:23
考虑到在f#中可以同时定义纯函数和非纯函数,如果有一种算法可以检查f#代码(函数定义)的纯度-检查程序代码的语义属性通常不能被赖斯定理所判定,我会很惊讶。
https://stackoverflow.com/questions/15884977
复制相似问题