如果我有一个函数:
let f (myClass : MyClass) x =
// do something using the instance of myClass and x
我像这样 curry f :
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
的调用(如上定义)都可以安全地替换为其结果(例如,将 g 5
替换为 6
),但调用 g1
不能,因为这会改变程序的控制台输出。
关于function - F# 纯函数和柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566800/