作者想象一种语言:函数、模块、库必须在类型里声明它们对共享资源(调度器、文件系统、socket、定时器)的交互,而调用方对被调函数如何使用这些资源拥有完全的控制。在这样一个语言里,测一个读写文件的库可以无缝换用内存文件系统而无需预先规划;测轮询加 sleep 的代码可以快进时间而不用真等。effect system 的价值不在于“让你能做 effect”,而在于你“默认就能”获得可组合、可测试的系统,不必刻意为之设计。作者用 Koka 写了一个 grep 示例展示 handler 如何把真实 IO 与内存替身互换,指出今日语言里几乎什么都能做,真正的差异在于“惯用且高性能”的做法是什么——而一个让 effect 成为默认而非例外的语言今天还不存在。
核心要点
effect system 的两个正交组件是类型系统(在函数类型里标注 effect)与运行时特性(捕获 continuation 交给 handler)
effect system 的关键价值不是能执行 effect,而是能禁止组件执行集合之外的 effect
测一个用文件系统的库,可无缝换用内存文件系统,无需库作者提前为测试设计
测带 sleep 与轮询的代码可以快进时间到下一事件,不必真的等待
今日语言的差异不在于“能不能”,而在于“惯用且高性能”怎么做——理想语言今天还不存在
金句
The point with effect systems is that, you don't get a composable and testable system when you design for it, you get it by default.(effect system 的意义在于,可组合、可测试的系统不是你专门设计出来的,而是默认就有的。)