代数效应(Algebraic Effects)

多层抽象需要共享琐碎数据时,一层层传递数据非常麻烦。如果能有一种方式可以在多层抽象中快捷地传递数据,同时又不需要牵涉到中间层级,那该有多好。React 中我们把它叫做“context”。

有时候数据依赖并不是严格按照抽象树自上而下进行。举个例子,在布局算法中,你需要在实现他们的位置之前了解子节点的大小。

现在,这个例子有一点超纲。我会使用 代数效应 这个由我发起的 ECMAScript 新特性提议。如果你对函数式编程很熟悉,它们 在避免由 monad 强制引入的仪式一样的编码。

  1. function ThemeBorderColorRequest() { }
  2. function FancyBox(children) {
  3. const color = raise new ThemeBorderColorRequest();
  4. return {
  5. borderWidth: '1px',
  6. borderColor: color,
  7. children: children
  8. };
  9. }
  10. function BlueTheme(children) {
  11. return try {
  12. children();
  13. } catch effect ThemeBorderColorRequest -> [, continuation] {
  14. continuation('blue');
  15. }
  16. }
  17. function App(data) {
  18. return BlueTheme(
  19. FancyUserList.bind(null, data.users)
  20. );
  21. }