函数式编程中的副作用抽象与实践
1. 副作用与二阶现实
在函数式编程中,我们需要考虑二阶现实,即程序运行时的技术现实,而不仅仅是业务逻辑。以除零错误为例:
def functionalDivision(n1: Double, n2: Double): Try[Double] =
if (n2 == 0) Failure(new RuntimeException("Division by zero!"))
else Success(n1 / n2)
这里使用 Try
数据结构来建模错误的二阶现实效果。通过分析 Try
数据结构来处理错误,编译器会强制要求我们在访问结果值之前检查错误,从而降低了复杂度。
在函数式编程中,检测二阶现实的特定现象并创建数据结构来封装它是一种常见模式。我们将这些封装二阶现实现象的数据结构称为效果类型(Effect Types)。
2. 效果类型的常见抽象方法
2.1 map
函数
假设我们要基于自定义除法函数构建一个新函数 f1
,计算 2 / x + 3
。一种实现方式是:
def f1(x: Double): Try[Double] =
divide(2, x) match {
case Success(res) => res + 3