【发布时间】:2020-05-16 06:23:11
【问题描述】:
对于产品类型,名义类型与结构类型是一种设计决策,在每种情况下都有直接的解释;您可以定义两个相同的记录类型,以相同的顺序具有相同的字段,但名称不同;它们是兼容的还是不兼容的;很容易看出每种可能性如何导致一个连贯的类型系统。
我不清楚这同样适用于 sum 类型;这些的全部意义在于您保留标签名称,以便您可以创建值并稍后区分它们。但在讨论名义类型与结构类型的讨论中,我找不到任何提及这个问题的地方。
是这样吗:
- 当然名义型和结构型只适用于产品类型,总和类型必须是名义型的,这一点不言而喻,所以没人费心提及。
- 实际上,sum 类型可以是结构化的,采用以下我没有想到的方式...
- 还有别的吗?
【问题讨论】:
-
Typescript 追求的是结构化类型。当您忽略名称时,标签将变为part of that structure。我认为这种方法相当不合理,但他们就是这样做的。
-
@bob 嗯!我不知道打字稿,但是如果我正确理解了该代码片段,它似乎将名称变成了字符串字段?从而实现名义类型 - 名称作为一个区别因素保持存在 - 没有这样的名义类型系统?
-
没错。他们称其为可区分联合(标记联合的同义词),其中特殊属性扮演判别式的角色,其值代表标签。如您所见,判别式的每个值都对应于类型构造函数的名称。这是相当令人困惑的部分,因为通常值构造函数的名称提供了标签,这些标签在编译期间不会被删除。
-
因此,根据 Davislor 的回答,两个数据声明
Val/File在 TS 中将被视为相等。这感觉不对,因为结构类型忽略了数据类型的语义部分,而这部分并未反映在其结构中。
标签: types functional-programming language-agnostic theory discriminated-union