功能编程是否避免了状态?

根据维基百科:函数式编程是一种编程范式,将计算视为数学函数的评估,并避免状态和可变数据。 (重点是我的)。

这是真的吗? 我个人的理解是,它使状态更加明确,因为编程基本上是将函数(变换)应用于给定状态以获得变换状态。 特别是像monads这样的结构可以让你明确地通过函数来​​承载状态。 我也不认为任何编程范例都可以完全避免状态。

那么,维基百科的定义是对还是错? 如果它是错误的定义函数式编程的更好方法是什么?

编辑 :我想这个问题的中心点是什么状态? 你是否理解状态是变量或对象属性(可变数据)还是不变数据也是状态? 举一个例子(在F#中):

let x = 3
let double n = 2 * n
let y = double x
printfn "%A" y

你会说这段代码包含了状态吗?

编辑2 :感谢大家参与。 我现在明白这个问题更多的是语言上的差异,因为布赖恩在他的评论中提到了使用state这个词不同于另一个社区。 特别是,函数式编程社区(主要是Haskellers)中的许多人将state解释为像随时间变化的信号一样承载某种活力状态。 诸如有限状态机,代表性状态传输和无状态网络协议之类的其他state使用可能意味着不同的事情。


我认为你只是以一种不寻常的方式使用“国家”这个词。 如果考虑添加1和1来使2有状态,那么可以说功能性编程包含状态。 但是当大多数人说“状态”时,他们的意思是存储和更改值,以至于调用函数可能会导致与调用函数之前不同的内容,并且使用相同的输入第二次调用该函数可能不会有相同的结果。

实质上,无状态计算就是这样的:

  • 1 + 1的结果
  • 由's'组成的字符串预置为“池”
  • 给定矩形的面积
  • 有状态计算就是这样的:

  • 增加一个计数器
  • 从数组中删除一个元素
  • 将矩形的宽度设置为现在的两倍

  • 而不是避免状态,可以这样想:

    它避免了改变状态。 这个词“可变”。

    用C#或Java对象来思考。 通常情况下,您会在对象上调用一个方法,并且您可能期望它会因该方法调用而修改其内部状态。

    使用函数式编程,您仍然有数据,但它只是通过每个函数,创建与输入和操作相对应的输出。

    至少在理论上。 事实上,并不是所有你所做的事情在功能上实际上都起作用,所以你经常最终隐藏状态以使事情发挥作用。

    编辑:
    当然,隐藏状态也经常导致一些惊人的错误,这就是为什么你应该只使用函数式编程语言来实现纯功能的情况。 我发现最好的语言是那些面向对象和功能的语言,比如Python或C#,它们给你两个世界的最好的选择,并且可以根据需要在每个语言之间自由移动。


    维基百科的定义是正确的。 起初它看起来令人费解,但如果你开始与Haskell合作,你会注意到你没有任何围绕着值的变量。

    国家仍然可以用国家单体代表。

    链接地址: http://www.djcxy.com/p/80841.html

    上一篇: Does functional programming avoid state?

    下一篇: client server that doesn't have mutable state?