【发布时间】:2019-02-21 22:37:48
【问题描述】:
如果您查看接口中的the flow docs on covariant/contravariant 字段,协变意味着只读,逆变意味着只写。但是,我真的不明白为什么。 In their docs on variance,它们被定义为
协方差
- 协方差不接受超类型。
- 协方差接受子类型。
逆变
- 逆变确实接受超类型。
- 逆变不接受子类型。
但在我看来,这并没有真正映射到只读/只写。谁能更深入地解释为什么会这样?
【问题讨论】:
-
这与 Haskell 或函数式编程有什么关系?
-
@dfeuer 协变和逆变来自范畴论,因此我认为一般了解 Haskell 或 FP 的人比我只用
flowtype标记它更有资格回答这个问题,几乎没有超过 1k 的追随者。同样,了解 Haskell 的人通常对类型理论了解更多。 -
@m0meni Haskell 没有普遍的子类型化,这就是在通用 OOP 语言中差异如此重要的原因,其中子类型化是这片土地的法则。另外,我不知道与范畴论有任何实质性联系。我认为,“协变”和“逆变”这两个词在范畴论之前就已经存在了很长时间。它们只是意味着“以相同的方式改变/改变/跟随”和“以其他方式改变/改变/发散”。协变/逆变函子之间存在联系,但翻译需要一些工作。
-
我认为在这种情况下,逆变和协方差意味着en.wikipedia.org/wiki/…。在 haskell 中,它们的含义完全不同 (fpcomplete.com/blog/2016/11/covariance-contravariance)
标签: javascript types flowtype