如果我有一个功能:
let f (myClass : MyClass) x =
// do something using the instance of myClass and x
我喜欢这样:
let myClass = new MyClass()
let g = f myClass
所以我可以打电话
let something = f 42
是纯粹的功能吗?或者是否捕获了对MyClass实例的引用使其不纯?
答案 0 :(得分:2)
它取决于函数调用哪些函数(或方法)以及这些函数(或方法)是否纯粹。捕获的对象完全无关紧要。
如果一个函数满足两个条件,则它被认为是“纯粹的”:(1)它总是在给定相同参数的情况下返回相同的结果;(2)它不会产生任何副作用(包括诸如输入/输出或变异数据之类的东西) )。该函数是否在闭包中捕获任何数据与纯度概念无关。
例如,以下函数是纯函数,即使它捕获闭包中的对象:
let f (c: MyClass) x = if c = null then x else x+1
let g = f (MyClass ())
但是以下功能是不纯的,即使它没有捕获任何数据:
let g1 x = printfn "%d" x
let g2 x = System.DateTime.Now.Minute + x
在这个例子中,g1
是不纯的,因为它以输出到控制台的形式产生副作用;并且g2
是不纯的,因为每次调用它都会返回不同的结果。
纯度定义背后的原始思想(也称为“引用透明度”)是程序中纯函数的调用可以用其结果替换而不警告程序的含义。这对各种优化和校样都很有用。
例如,任何g
的调用(如上所定义)都可以安全地替换为其结果(例如将g 5
替换为6
),但调用g1
不能,因为这会改变程序的控制台输出。