function - F# 纯函数和柯里化(Currying)

标签 function f# currying

如果我有一个函数:

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/

相关文章:

jQuery 验证两个提交按钮

python - Python中的函数链

f# - 如何等待异步方法,类似于 C#

function - 这些功能有什么区别

haskell - 内存乘法

function - OCaml 递归函数应用一个函数 n 次

ruby-on-rails - 在 heroku 上的 postgresql 数据库中创建一个函数

.net - 如何使一元否定和数学函数适用于继承类型?

generics - F# generics 泛型构造要求类型 'struct (Guid * int)' 具有公共(public)默认构造函数

Scala 重载函数添加柯里化(Currying)?