Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断F#函数是否为纯函数?_F#_Pure Function - Fatal编程技术网

如何判断F#函数是否为纯函数?

如何判断F#函数是否为纯函数?,f#,pure-function,F#,Pure Function,假设我有两个F#函数: let sq x = x*x let tm = DateTime.Now 显然,sq是纯的,因为它总是为给定的输入返回相同的值,而tm是不纯的,因为它每次调用时都返回不同的值 一般来说,有没有一种方法可以在不分析F#中的某个特定函数的作用(换句话说,逐行读取)的情况下确定它是纯函数还是不纯函数 或者,有没有一种方法可以对函数进行注释,以便在编写函数时告诉编译器该函数是纯函数还是不纯函数 最后,当调用作为公共语言运行库一部分的函数(如DateTime)时,如何在不尝试的

假设我有两个F#函数:

let sq x = x*x

let tm = DateTime.Now
显然,sq是纯的,因为它总是为给定的输入返回相同的值,而tm是不纯的,因为它每次调用时都返回不同的值

一般来说,有没有一种方法可以在不分析F#中的某个特定函数的作用(换句话说,逐行读取)的情况下确定它是纯函数还是不纯函数

或者,有没有一种方法可以对函数进行注释,以便在编写函数时告诉编译器该函数是纯函数还是不纯函数

最后,当调用作为公共语言运行库一部分的函数(如DateTime)时,如何在不尝试的情况下判断它是纯函数还是不纯函数

注:“纯”是指维基百科的定义:()

在计算机编程中,一个函数可以被描述为纯函数,如果两者都是 关于函数的以下语句保持不变:

  • 对于相同的参数,函数始终计算相同的结果值 价值。函数结果值不能依赖于任何 隐藏的信息或状态可能会随着程序的执行而改变 继续或在程序的不同执行之间执行,也不能 依赖于来自I/O设备的任何外部输入

  • 对结果的评估不会导致任何语义上可观察的方面 效果或输出,如可变对象的突变 或输出到I/O设备

  • F#没有提供任何功能和工具来检查方法是否纯粹,因此一个简单的答案是您必须自己检查这个属性


    在F#之外,值得注意的是,库有纯方法的概念(它们可以用标记),但我不完全确定这里的检查故事是什么。我认为代码契约附带了分析IL的静态检查器(也应该适用于F#),但这是一项相当困难的任务,所以我希望它会非常有限。但是,在某些BCL方法上使用了
    PureAttribute
    ,因此可以看出某些标准.NET方法是纯的。

    从技术上讲,您的“tm”值不是函数,而是DateTime类型的值,并且是不可变的,因此,每次在创建该值后对其进行求值时,都是相同的。

    鉴于可以在f#中同时定义纯函数和纯函数,如果有一种算法可以检查f#代码(函数定义),我会非常惊讶对于纯度——检查程序代码的语义属性通常不能用赖斯定理来判定。

    当你说纯时,你真的是指幂等的吗?还是说它没有副作用?啊,所以维基百科都这么说。很公平。FWIW,我不认为微软提供了任何类型的注释或属性,将函数标记为“纯…”你只需要知道。你可能会发现这个问题的答案值得一读……如果你说让tm()=DateTime.Now(注意,添加了括号),那就更清楚了您可能会强迫它成为一个函数,这可能是您的意图。
    PureAttribute
    只是告诉代码契约该函数是纯函数的一种方式-没有执行任何分析(运行时或静态)。不幸的是,代码契约与F#一起工作。实际上这样做,两人都站在齐膝深的命令式和函数式编程中,所以这是可能的。他们是在某些情况下还是在所有情况下都这样做?尼姆在几周前补充了最后一次剩下的边缘案例报道。我不知道Haxe。线程启动程序希望能够“确定F#中的特定函数是纯函数还是不纯函数”。据我所知,Nim验证了一些纯函数实际上是纯函数。但是,我知道threadstarter需要一个过程,给定任何函数都可以决定手头的函数是否是纯函数。特别是,如果一个函数与一个全局可变变量交互,但最终没有改变它,那么这个(取决于你对纯粹性的定义)应该被认为是一个纯函数——我仍然认为这是不可能的。是的,这可能是真的。尽管如此,F#不能做到这一点,也不能做到那一点,而在某些支持命令式设计的语言中这根本不可能的评论是不正确的。