在一本函数式编程的书中,作者提到以下是副作用:
谢谢, Mohamed
- 修改变量
- 就地修改数据结构
- 在对象上设置字段
- 抛出异常或停止错误
- 打印到控制台或读取用户输入
- 读取或写入文件
- 在屏幕上绘制
谢谢, Mohamed
如何编写一份纯函数式程序,使其在任何情况下都有用?这是不可能的。纯函数式程序只会让 CPU 加热,它需要一个不纯的部分(解释器),才能真正将数据写入磁盘或网络中。以这种方式进行编程有几个重要的优点。纯函数式部分易于测试(测试纯函数很容易),而纯函数的引用透明性使得在本地推理代码变得容易,整个开发过程更少出现错误,更加高效。同时,它还提供了优雅的处理传统上混乱防御性代码的方式。
那么,在函数式编程中实现副作用的常见方法是什么呢?就像前面所说的,使用值来表示它们,然后编写解释这些值的代码。关于整个过程的非常好的解释可以在这个博客系列中找到。
为了简洁起见,让我过度简化并简短地说:
在纯函数式编程中处理“副作用”,您(程序员)从输入到输出编写纯函数,系统通过将这些纯函数应用于“真实世界”来引起副作用。
例如,要读取整数x
并写入x+1
,您(粗略地说)编写一个函数f(x) = x+1
,系统将其应用于实际输入并输出其返回值。
另一个例子是,您的纯函数不会引发异常作为副作用,而是返回表示异常的特殊值。 Haskell中的各种“单子”(如IO
)概括了这些思想,即通过纯函数表示副作用(当然,实际的实现更加复杂)。