函数式编程中的外部效应、I/O 与局部效应
1. 可组合抽象与 I/O 编程
在编程中,使用可组合抽象(如 List )进行编程比直接使用原始 I/O 操作要好得多。例如 movingAvg 函数可以由更小的部分组合而成,还可以使用通用组合器 windowed 来构建:
def movingAvg(n: Int)(l: List[Double]): List[Double] = ???
val cs = movingAvg(5)(
lines.map(s => fahrenheitToCelsius(s.toDouble))).map(_.toString)
def windowed[A](n: Int, l: List[A])(f: A => B)(using m: Monoid[B]): List[B]
函数式编程给予了我们灵活性,我们可以构建任何想要的抽象来创建执行 I/O 的计算。如果喜欢列表的隐喻,就可以设计一个类似列表的 API 来表达 I/O 计算;若发现其他可组合抽象,也能找到使用它的方法。
2. 纯函数式处理外部效应和 I/O 的模型
我们可以将不纯的过程分解为一个纯核心函数和两个有副作用的过程:一个提供纯函数的输入,另一个处理纯函数的输出。通过将效应移动到程序的外层,我们推广出了 IO 数据类型,它能让我们在不借助副作用的情况下描述与外部世界的交互。
不过,Scala 中的单子存在栈溢出
超级会员免费看
订阅专栏 解锁全文
1100

被折叠的 条评论
为什么被折叠?



