Function F#纯函数与currying
如果我有一个函数:Function F#纯函数与currying,function,f#,currying,Function,F#,Currying,如果我有一个函数: 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 g是纯函数吗?或者它捕获到的对MyClass实例的引用是否会使其不纯净?这取决于函数调用的函数(或方法)以及这些函数(或方法)是
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
g是纯函数吗?或者它捕获到的对MyClass实例的引用是否会使其不纯净?这取决于函数调用的函数(或方法)以及这些函数(或方法)是否纯净。捕获的对象完全不相关 如果函数满足两个条件,则认为它是“纯的”(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
(如上定义)的任何调用都可以安全地替换为其结果(例如,将g5
替换为6
),但调用g1
则不能,因为这将改变程序的控制台输出