Functional programming 函数式编程中的副作用

Functional programming 函数式编程中的副作用,functional-programming,side-effects,Functional Programming,Side Effects,在一本函数式编程书中,作者提到了以下副作用 修改变量 就地修改数据结构 在对象上设置字段 引发异常或因错误而停止 打印到控制台或读取用户输入 读取或写入文件 在屏幕上绘图 我只是想知道,如果它们是副作用的话,在不读取或写入文件的情况下编写纯函数程序是怎么可能的。如果是,那么在功能世界中实现这一点的通用方法是什么 谢谢, 穆罕默德为了简洁起见,让我(过度)简化长话短说: 为了处理纯函数式编程中的“副作用”,您(程序员)编写从输入到输出的纯函数,系统通过将这些纯函数应用到“真实世界”来产生副作用 例

在一本函数式编程书中,作者提到了以下副作用

  • 修改变量
  • 就地修改数据结构
  • 在对象上设置字段
  • 引发异常或因错误而停止
  • 打印到控制台或读取用户输入
  • 读取或写入文件
  • 在屏幕上绘图
  • 我只是想知道,如果它们是副作用的话,在不读取或写入文件的情况下编写纯函数程序是怎么可能的。如果是,那么在功能世界中实现这一点的通用方法是什么

    谢谢,
    穆罕默德

    为了简洁起见,让我(过度)简化长话短说:

    为了处理纯函数式编程中的“副作用”,您(程序员)编写从输入到输出的纯函数,系统通过将这些纯函数应用到“真实世界”来产生副作用

    例如,要读取整数
    x
    并写入
    x+1
    ,您(粗略地说)编写一个函数
    f(x)=x+1
    ,系统将其应用于实际输入并输出其返回值


    另一个例子是,pure函数不是作为副作用引发异常,而是返回一个表示异常的特殊值。各种“单子”(如Haskell中的单子)概括了这些思想,即用纯函数表示副作用(当然,实际实现更为复杂)。

    为了简洁起见,让我(过度)简化,长话短说:

    为了处理纯函数式编程中的“副作用”,您(程序员)编写从输入到输出的纯函数,系统通过将这些纯函数应用到“真实世界”来产生副作用

    例如,要读取整数
    x
    并写入
    x+1
    ,您(粗略地说)编写一个函数
    f(x)=x+1
    ,系统将其应用于实际输入并输出其返回值


    另一个例子是,pure函数不是作为副作用引发异常,而是返回一个表示异常的特殊值。各种“单子”,如Haskell中的单子,概括了这些思想,也就是说,用纯函数表示副作用(当然,实际实现更复杂)。

    正确回答这个问题可能需要一整本书(不太长)。这里的要点是,函数式编程旨在将逻辑描述/表示与实际的运行时解释分开。函数代码只是以值的形式表示(不运行)程序的效果,返回某种描述计算的抽象语法树。代码的另一部分(通常称为解释器)将接受这些值并惰性地运行实际效果。那部分不起作用

    如何编写一个在任何方面都有用的纯函数程序?这是不可能的。一个纯功能程序只会加热CPU。它需要一个不纯的部分(解释器)来实际写入磁盘或网络。纯函数部分很容易测试(测试纯函数很容易),而纯函数的性质使测试变得容易,从而使整个开发过程中的错误更少,效率更高。它还提供


    那么,在功能领域,实现副作用的常见方法是什么?如前所述,使用值表示它们,然后编写解释这些值的代码。可以找到对整个过程的很好的解释。

    正确回答这个问题可能需要一本完整的书(不要太长)。这里的要点是,函数式编程旨在将逻辑描述/表示与实际的运行时解释分开。函数代码只是以值的形式表示(不运行)程序的效果,返回某种描述计算的抽象语法树。代码的另一部分(通常称为解释器)将接受这些值并惰性地运行实际效果。那部分不起作用

    如何编写一个在任何方面都有用的纯函数程序?这是不可能的。一个纯功能程序只会加热CPU。它需要一个不纯的部分(解释器)来实际写入磁盘或网络。纯函数部分很容易测试(测试纯函数很容易),而纯函数的性质使测试变得容易,从而使整个开发过程中的错误更少,效率更高。它还提供


    那么,在功能领域,实现副作用的常见方法是什么?如前所述,使用值表示它们,然后编写解释这些值的代码。对整个过程有一个很好的解释。

    我认为这是不可能的。我们总是为副作用编写程序,目标不是完全避免副作用,因为如果你没有副作用,你的程序根本就没有任何作用:)目标是尽可能多地编写纯代码,并尽可能多地将其与不纯代码分开。可能的重复继续@cstuncsik的想法,我们这样做的部分原因是,分离出来的不纯代码是我们不想测试的部分——它不是“我们正在编写的”。如果我们把其余的(我们正在写的)都变得纯粹,那么它是可预测的/可测试的,不纯洁的表面被最小化。我认为这是不可能的。我们总是为副作用编写程序,目标不是完全避免副作用,因为如果你没有副作用,你的程序根本就没有任何作用:)目标是尽可能多地编写纯代码,并尽可能多地将其与不纯代码分开。可能的重复继续@cstuncsik的想法,我们这样做的部分原因是分离出来的不纯代码是我们不想测试的部分——它不是“我们写的东西”