Functional programming 函数式编程的副作用是什么?

Functional programming 函数式编程的副作用是什么?,functional-programming,java-8,Functional Programming,Java 8,我最近在学习Java 8,我看到了一个与函数编程相关的定义,即“仅使用纯函数创建的程序,不允许有副作用” 副作用之一是“在适当的位置修改数据结构” 我不明白这句话的意思,因为最后我们需要在一些地方与数据库对话,以存储、检索或更新数据 修改数据库不是函数式的意味着我们将如何在函数式编程中使用数据库 “就地修改数据结构”意味着您直接操作输入数据结构(即列表)。“纯函数”是指 结果只是其输入的函数,而不是其他隐藏状态 该函数可在同一输入上多次应用,产生相同的结果。它不会改变输入 在面向对象编程中,

我最近在学习Java 8,我看到了一个与函数编程相关的定义,即“仅使用纯函数创建的程序,不允许有副作用”

副作用之一是“在适当的位置修改数据结构”

我不明白这句话的意思,因为最后我们需要在一些地方与数据库对话,以存储、检索或更新数据

修改数据库不是函数式的意味着我们将如何在函数式编程中使用数据库

“就地修改数据结构”意味着您直接操作输入数据结构(即列表)。“纯函数”是指

  • 结果只是其输入的函数,而不是其他隐藏状态
  • 该函数可在同一输入上多次应用,产生相同的结果。它不会改变输入
在面向对象编程中,定义对象的行为。行为可以是提供对对象状态的读访问,也可以是对对象状态的写访问,或者两者兼而有之。当组合不同关注点的操作时,可能会引入副作用

例如,堆栈及其
pop()
操作。它将为每个调用生成不同的结果,因为它会更改堆栈的状态

在函数式编程中,将函数应用于不可变值。函数表示数据流,而不是状态变化。所以函数本身是无状态的。函数的结果要么是原始输入,要么是与输入不同的值,但决不是修改后的输入

OO也知道函数,但并非所有情况下都是纯函数,例如排序:在非函数编程中,您在原始数据结构(“就地”)中重新排列列表的元素。在Java中,Collections.sort()就是这样做的

在函数式编程中,将对输入值(列表)应用排序函数,从而生成具有排序值的新值(新列表)。函数本身没有状态,输入的状态也没有修改

一般来说:给定相同的输入值,对该值应用函数会产生相同的结果值

关于数据库操作。数据库本身的内容表示一种状态,它是所有存储值、表等的组合(“快照”)。当然,您可以对该数据应用函数来生成新数据。通常,您将操作结果存储回数据库,从而更改整个系统的状态,但这并不意味着您更改函数的状态或其输入数据。再次应用函数不会违反纯函数约束,因为您将数据应用于新的输入数据。但将整个系统视为“数据结构”将违反该约束,因为函数应用程序会更改“输入”的状态

因此,整个数据库系统很难被认为是功能性的,但您当然可以以功能性的方式对数据进行操作

但Java允许您同时执行(OO和FP),甚至混合使用这两种范式,所以您可以选择最适合您需要的方法

或者引用

如果您有多种需求,请混合您的范例。不要 限制自己只使用手机的右下角 工具箱

“就地修改数据结构”意味着您直接操作输入数据结构(即列表)。“纯函数”是指

  • 结果只是其输入的函数,而不是其他隐藏状态
  • 该函数可在同一输入上多次应用,产生相同的结果。它不会改变输入
在面向对象编程中,定义对象的行为。行为可以是提供对对象状态的读访问,也可以是对对象状态的写访问,或者两者兼而有之。当组合不同关注点的操作时,可能会引入副作用

例如,堆栈及其
pop()
操作。它将为每个调用生成不同的结果,因为它会更改堆栈的状态

在函数式编程中,将函数应用于不可变值。函数表示数据流,而不是状态变化。所以函数本身是无状态的。函数的结果要么是原始输入,要么是与输入不同的值,但决不是修改后的输入

OO也知道函数,但并非所有情况下都是纯函数,例如排序:在非函数编程中,您在原始数据结构(“就地”)中重新排列列表的元素。在Java中,Collections.sort()就是这样做的

在函数式编程中,将对输入值(列表)应用排序函数,从而生成具有排序值的新值(新列表)。函数本身没有状态,输入的状态也没有修改

一般来说:给定相同的输入值,对该值应用函数会产生相同的结果值

关于数据库操作。数据库本身的内容表示一种状态,它是所有存储值、表等的组合(“快照”)。当然,您可以对该数据应用函数来生成新数据。通常,您将操作结果存储回数据库,从而更改整个系统的状态,但这并不意味着您更改函数的状态或其输入数据。再次应用函数不会违反纯函数约束,因为您将数据应用于新的输入数据。但将整个系统视为“数据结构”将违反该约束,因为函数应用程序会更改“输入”的状态

因此,整个数据库系统很难被认为是功能性的,但您当然可以以功能性的方式对数据进行操作

但是Java允许您同时执行(OO和FP)甚至mi