什么是联合类型和交叉类型?
我已经参考了这个问题,但一些小型工作类型系统会更好,不必是实际的。
具体来说,我所指的联合类型是这篇博客文章中提到的 而不是求和类型,其中伪代码看起来像:
{String, null} findName1() {
if (...) {
return "okay";
} else {
return null;
}
}
wikipedia页面简要解释了交叉类型和联合类型,但似乎没有更多相关参考资料。
什么是联合类型和交叉类型?
我已经参考了这个问题,但一些小型工作类型系统会更好,不必是实际的。
具体来说,我所指的联合类型是这篇博客文章中提到的 而不是求和类型,其中伪代码看起来像:
{String, null} findName1() {
if (...) {
return "okay";
} else {
return null;
}
}
wikipedia页面简要解释了交叉类型和联合类型,但似乎没有更多相关参考资料。
data FooBar = Foo Integer | Bar String
这样的求和类型允许您告诉FooBar
值包含一个Integer
还是一个String
(因为FooBar
值带有Foo
或Bar
标记)。即使我们编写了data FooBar = Foo Integer | Bar Integer
,其中两种类型相同,“标记”也会添加额外信息,我们可以确定FooBar
值是哪个整数。data FooBar = Integer | String
的东西。 FooBar
中的值仅是所有字符串值和所有整数值。如果我们将相同的两种类型制作成联合类型,例如data FooBar = Integer | Integer
,则从逻辑上讲,它应该与Integer
本身无法区分,因为集合与自身的联合就是自身。A -> C
和操作B -> D
组合在一起,以获取操作(A | B) ->(C | D)
,就像您可以使用求和类型的标签将求和类型路由到适当的操作一样。但是对于完全通用的联合类型,这变得模糊起来。如果A和B重叠(并且一旦有了联合类型,重叠类型就会进入战场),那么在重叠区域中对值调用哪个操作?如果您可以确定它是A还是B,那么您实际上拥有一个求和类型而不是联合类型,如果应用一些任意的解决策略(例如选择A -> C
操作,因为A 在联合��型的定义中较早列出,则在简单情况下工作正常,但是如果具有诸如(A | B)&(B | A)
之类的类型,则会变得非常令人困惑(其中我使用&
表示交集)。
2 虽然"不相交类型"的观点是有争议的。在像data Maybe a = Nothing | Just a
这样的类型中,您可以合理地认为Nothing
即使对于不同的a
也是“相同值”。如果是这样的话,那么Maybe String
和Maybe Integer
的并集只包含一个Nothing
(而不是既是“无字符串”的Nothing
,也是“无整数”的Nothing
)。而Maybe String
和Maybe Integer
的交集仅包含一个值,即Nothing
。
id
函数属于Int -> Int
和String -> String
类型,因此属于Int->Int&String->String
? - shhyou{String,null}
这样的类型,我们是否可以首先检查给定的值是否为String
,如果是,则提取出String
类型的值? - shhyouint
是所有有效整数的集合),则联合类型对应于集合并,而交集类型对应于集合交。
在Whiley中,联合类型的经典示例是表示“可空”类型,如下所示:
null|int indexOf(string str, char c):
for i in 0..|str|:
if str[i] == c:
return i // found a match
// didn't find a match
return null
null|int
可以包含任何有效的整数,或者特殊值 null
。在Whiley中,你不能对这种类型进行算术运算。因此,在使用返回值之前,必须首先进行类型测试以检查是否为null值。例如,像这样:string replaceFirst(string str, char old, char new):
idx = indexOf(str,old)
if idx is int:
str[idx] = new
// return potentially updated string
return str
我已经在Whiley中写了一些关于联合类型的文章,可以在这里和这里找到。相似的是交集类型,尽管目前编译器对其支持不太好。
Boolean
是值为 true
和 false
的集合,则说某个值具有类型 Boolean
意味着它是值 true
或 false
中的一个。String
)可能具有无限多个可能的值。