我是 Haskell 初学者,我想创建一个函数来确定两个列表之间是否存在同构。我认为如果它们的长度相同 > 0,答案是肯定的。
但是空集呢?空集之间可以存在同构吗?
谢谢。
我是 Haskell 初学者,我想创建一个函数来确定两个列表之间是否存在同构。我认为如果它们的长度相同 > 0,答案是肯定的。
但是空集呢?空集之间可以存在同构吗?
谢谢。
在 Haskell 中,我们通常将类型视为类别中的对象,而不是单个值。询问一个列表(一个值)是否与其他列表同构是没有意义的,除非我们定义一个列表是对象的“自定义”类别。在后一种情况下,答案取决于我们如何定义类别。
无论如何,在集合的范畴中,给定任何集合,从空集到A
,只有一个函数(态射)。这是空域的唯一函数,恰好与空集重合。为了帮助理解这一点,回想一下函数是一组对f : {} -> A
{}
A
f : X -> Y
f = {(x0,y0),(x1,y1),....}
with x0,x1,... in X, and y0,y1,... in Y
这样
for any x in X there is a unique y in Y satisfying (x,y) in f
什么时候X = {}
,我们不能选择x0,x1,... in X
,所以唯一的选择是拥有f = {}
,“空对集”。这f
是一个函数,因为条件简化为
for any x in {} .......
这是一个空洞的真理,因为空集上的全称量化总是正确的。
因此,f : {} -> A
任何A
. 即使 也是如此A = {}
,在这种情况下f : {} -> {}
也是同构。事实上,我们有f = id
(因为没有其他函数!),并且f . f = f = id
(因为没有其他函数!),所以f
它自己的逆。
当然,这取决于类别!
在标准类别 SET 中,对象是集合,箭头 A -> B 是将 B 的元素与 A 的每个元素相关联的函数,在表示空集的任何两个对象之间肯定存在同构——事实上,它们是同一个对象!
人们还可以想象一个类别,其中集合用额外的代数结构丰富(因此有一个从这个类别到 SET 的明智的健忘函子),其中额外的代数结构允许区分两个对象,尽管健忘函子将它们都映射到空集,在这种情况下,它们之间可能没有同构。