【发布时间】:2013-03-30 21:09:51
【问题描述】:
假设我有这两个 F# 函数:
let sq x = x*x
let tm = DateTime.Now
显然 sq 是纯的,因为它对于给定的输入总是返回相同的值,而 tm 是不纯的,因为每次调用它都会返回不同的值。
一般来说,有没有一种方法可以确定 F# 中的特定函数是纯函数还是不纯函数,而无需分析它的作用,换句话说,就是逐行读取它?
或者有没有办法在你写的时候给一个函数注解,告诉编译器这个函数是纯的还是不纯的?
最后,当调用一个属于公共语言运行时(例如 DateTime)的函数时,如何不尝试就判断它是纯的还是不纯的?
注意:“纯”是指来自维基百科的定义:http://en.wikipedia.org/wiki/Pure_function (permalink)
在计算机编程中,如果两个函数都可以描述为纯函数 这些关于函数的陈述成立:
在给定相同参数的情况下,该函数始终计算相同的结果值 值。函数结果值不能依赖于任何 可能随着程序执行而改变的隐藏信息或状态 进行或在程序的不同执行之间,也不能 依赖于来自 I/O 设备的任何外部输入。
结果的评估不会导致任何语义上可观察的一面 效果或输出,例如可变对象的突变 或输出到 I/O 设备。
【问题讨论】:
-
当你说纯,你真的是指幂等吗?还是说没有副作用?
-
啊,所以维基百科说两者。很公平。 FWIW,我不认为 Microsoft 提供任何类型的注释或属性将功能标记为“纯......”你只需要知道。
-
这个问题stackoverflow.com/questions/4391524/… 值得一读。
标签: f# pure-function