功能编程中的副作用

问题描述 投票:8回答:2

在功能编程书中,作者提到以下是副作用。

  1. 修改变量
  2. 修改数据结构
  3. 在对象上设置字段
  4. 抛出异常或因错误而停止
  5. 打印到控制台或读取用户输入
  6. 读取或写入文件
  7. 在屏幕上绘图

我只是想知道如果它们是副作用,如果没有读取或写入文件就可以编写纯函数程序。如果是,那么在功能世界中实现这一目标的常用方法是什么?

谢谢,穆罕默德

functional-programming side-effects
2个回答
5
投票

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

如何编写一个有用的纯函数程序?这不可能。纯功能程序只会加热CPU。它需要一个实际写入磁盘或网络的不纯部分(解释器)。 There are several important advantages in doing it that way。纯功能部件易于测试(测试纯函数很容易),纯函数的referentially transparent性质使reason about your code locally变得容易,使整个开发过程变得更少,更有效率。它还提供elegant ways to deal with traditionally obfuscated defensive code

那么功能世界中实现副作用的常用方法是什么?如上所述,使用值表示它们,然后编写解释这些值的代码。 in these blog post series可以找到对整个过程的一个非常好的解释。


3
投票

为了简洁起见,让我(简化)简化并简化长篇故事:

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

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

再举一个例子,您的纯函数返回一个表示异常的特殊值,而不是将异常作为副作用引发。诸如Haskell中的IO之类的各种“monad”概括了这些想法,即通过纯函数表示副作用(当然,实际实现更复杂)。

© www.soinside.com 2019 - 2024. All rights reserved.