xiuy

xiuy

V2EX member #444909, joined on 2019-10-07 06:04:40 +08:00
I study programming languages.
Per xiuy's settings, the topics list is hidden
Deals info, including closed deals, is not hidden
xiuy's recent replies
Sep 3, 2024
Replied to a topic by VERT1GO 职场话题 编译器开发相关的工作值得入坑吗?
是 HDC 刚发布的语言那个团队吗
来这里问这个没什么帮助的
这个回答不能称得上是对协变、逆变的解释,只是针对这个问题来说,这个答案还是讲得挺明白的。

要理解 covariant 和 contravariant 的话,首先要明白的是 subtype 的基础概念。

> Type S is a subtype of a type T, written S <: T, if an expression of type S can be used in any context that expects an element of type T.

举个例子的话,就是任何需要一个 Animal 的地方,都可以放进去一个 Dog,那么 Dog <: Animal 。(看着很像 Inheritance 是因为大多数的程序语言把 Inheritance 和 Subtyping 混在一起了)

而协变与逆变其实与 Function Subtyping 有关。(也就是 #2 中的「只有将类型作为参量(包括泛型)才有协变逆变之说」)

Function Subtyping 的定义是这样婶儿滴:(S' -> T') <: (S -> T) if S <: S' and T' <: T.

协变和逆变就是从这里来的,这里的 S <: S' 就是逆变,而 T' <: T 是协变。

说直白一点就是 T' <: T 是顺着 (S' -> T') <: (S -> T) 来的,而 S <: S' 这个关系要求逆过来。

再叨叨多一点,这个定义其实挺反直觉的,如果要 (S' -> T') <: (S -> T) 的话,我们可能以为条件应该是 S' <: S 和 T' <: T 。这时候需要回头在看一下 subtypes 的定义:*S <: T, if an expression of type S can be used in any context that expects an element of type T*. **当 T 变成了 f, 问题就转为寻找一个能代替 f 的 f'。**

这个图示非常有助于理解:

![Untitled.png]( https://i.loli.net/2020/11/16/Hy3fKGed5gYI6uv.png)

S 需要是 S' 的 subtype ( S <: S'),任何原来的输入才能放得进去;而 T' 必须是 T 的 subtype,任何出来的 T' 才能被视作 T 。

对于有范型的类来说,我觉得 [Scala 这个文档]( https://docs.scala-lang.org/zh-cn/tour/variances.html) 讲得挺好的,不会 Scala 也能看懂。
送过男朋友明基的屏幕挂灯,Filco 奶酪绿,简单点的比如 switch 的收纳包之类的,今天给他买了个冈村的椅子,可以从他发的日常图片观察一下他缺啥之类的 or 直接问他需要什么,最快。哦对了还可以考虑买个钱包之类的。
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   902 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 22:26 · PVG 06:26 · LAX 15:26 · JFK 18:26
♥ Do have faith in what you're doing.