根据wikipedia:函数式编程是一种编程范式,将计算视为数学函数的评估,避免状态和可变数据。 (强调我的)。
这是真的吗?我个人的理解是,它使状态更明确,因为编程实质上是将函数(变换)应用于给定状态以获得转换状态。特别是像monad这样的结构允许你通过函数显式地携带状态。我也不认为任何编程范式都可以完全避免状态。
那么,维基百科的定义是对还是错?如果错了什么是定义函数式编程的更好方法呢?
编辑:我想这个问题的核心点是什么是状态?你是否了解状态是变量或对象属性(可变数据)还是不可变数据也是州?举一个例子(在F#中):
let x = 3
let double n = 2 * n
let y = double x
printfn "%A" y
你会说这个片段是否包含州?
编辑2 :感谢大家的参与。我现在明白这个问题更多的是语言上的差异,使用state
这个词在一个社区与另一个社区之间存在差异,正如布莱恩在评论中提到的那样。特别是,函数式编程社区中的许多人(主要是Haskellers)将state
解释为携带一些动态状态,就像信号随时间变化一样。 {em>有限状态机, Representational State Transfer 和无状态网络协议之类的state
的其他用途可能意味着不同的事情。< / p>
答案 0 :(得分:21)
我认为你只是以一种不寻常的方式使用“国家”一词。如果你考虑添加1和1来使2成为有状态,那么你可以说函数式编程包含状态。但是当大多数人说“状态”时,它们意味着存储和更改值,这样调用函数可能会留下与调用函数之前不同的东西,并且使用相同的输入第二次调用函数可能不会产生相同的结果。
答案 1 :(得分:8)
不要避免国家,而是这样想:
避免更改状态。这个词“可变”。
考虑C#或Java对象。通常你会在对象上调用一个方法,你可能希望它通过该方法调用来修改它的内部状态。
使用函数式编程,您仍然拥有数据,但它只是通过每个函数,创建对应于输入和操作的输出。
至少在理论上。实际上,并非你所做的所有事情在功能上都是 ,所以你经常最终隐藏状态以使事情有效。
修改强>
当然,隐藏状态也经常导致一些壮观的错误,这就是为什么你应该只使用函数式编程语言来实现纯粹的功能。我发现最好的语言是面向对象的和功能的语言,比如Python或C#,它们为您提供两全其美的优势,并在必要时自由移动。
答案 2 :(得分:2)
维基百科的定义是正确的。一开始可能看起来令人费解,但如果你开始使用Haskell,你会注意到你没有任何变量包含值。
状态仍然可以使用state monads表示。
答案 3 :(得分:1)
维基百科的定义是对的。功能编程避免了状态。函数式编程意味着您将函数应用于给定的输入并获得结果。但是,保证您的输入不会以任何方式进行修改。这并不意味着你根本就没有国家。 Monads就是一个很好的例子。