代码之家  ›  专栏  ›  技术社区  ›  Muhammad Alkarouri

函数编程是否避免状态?

  •  17
  • Muhammad Alkarouri  · 技术社区  · 16 年前

    根据 wikipedia :函数编程是一种编程范例,它将计算视为数学函数的评估,并且 避免状态 和可变数据。(强调我的)。

    这是真的吗?我个人的理解是,它使状态更加明确,从某种意义上说,编程本质上是将函数(转换)应用于给定状态以获得转换状态。特别是,像monads这样的构造允许您通过函数显式地携带状态。我也不认为任何编程范式都可以完全避免状态。

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

    编辑 :我想这个问题的中心点是 什么是国家? 您了解状态是变量或对象属性(可变数据)还是不可变数据也是状态?举个例子(F):

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

    您认为此代码段是否包含状态?

    编辑2 :感谢大家的参与。我现在明白了这个问题,更多的是语言上的差异,以及这个词的用法。 state 正如布赖恩在评论中所提到的,不同社区之间的差异。特别是,功能编程社区中的许多人(主要是Haskeller)解释 状态 携带某种动态状态,如随时间变化的信号。其他用途 状态 诸如此类 有限状态机 , 表述性状态转移 和 无状态网络协议 可能意味着不同的事情。

    4 回复  |  直到 16 年前
        1
  •  21
  •   Chuck    16 年前

    我认为你只是以一种不寻常的方式使用了“国家”这个词。如果您考虑添加1和1以获得2作为有状态的,那么您可以说函数式编程包含状态。但是,当大多数人说“状态”时,他们的意思是存储和更改值,这样调用一个函数可能会留下与调用函数之前不同的东西,并且使用相同的输入再次调用函数可能不会产生相同的结果。

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

    • 1+1的结果
    • 由“s”组成的字符串,该字符串已前置到“pool”
    • 给定矩形的面积

    状态计算是这样的:

    • 递增计数器
    • 从数组中移除元素
    • 将矩形的宽度设置为现在的两倍
        2
  •  8
  •   Randolpho    16 年前

    与其逃避国家,不如这样想:

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

    用C语言或Java对象来思考。通常,您会对对象调用一个方法,并且您可能期望它在该方法调用之后修改其内部状态。

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

    至少理论上是这样。实际上,并不是你做的每件事 作品 在功能上,你经常会隐藏状态以使事情正常工作。

    编辑:
    当然,隐藏状态也经常会导致一些惊人的错误,这就是为什么您应该只在纯功能的情况下使用函数式编程语言的原因。我发现最好的语言是面向对象的语言 和 功能性,如python或c_,为您提供两个世界中最好的,并在必要时在两者之间自由移动。

        3
  •  2
  •   aioobe    16 年前

    维基百科的定义是正确的。一开始可能会让人困惑,但是如果你开始使用say haskell,你会注意到你周围没有任何包含值的变量。

    状态仍然可以用 state monads .

        4
  •  1
  •   user405725    16 年前

    维基百科的定义是正确的。函数式编程避免了状态。函数编程意味着你将一个函数应用到一个给定的输入并得到一个结果。但是,可以保证不会以任何方式修改您的输入。这并不意味着你不能有一个状态。单子就是最好的例子。

    推荐文章