我是Haskell的初学者,我想创建一个函数来确定两个列表之间是否存在同构。我认为如果长度相同> 0,答案是肯定的。
但是空集呢?空集之间可以有同构吗?
谢谢。
答案 0 :(得分:3)
这当然取决于类别!
在标准类别SET中,其中的对象是集合,箭头A-> B是将B的元素与A的每个元素相关联的函数,表示空集合的任何两个对象之间肯定存在同构关系-实际上,他们是同一个对象!
还可以想象一个类别,其中集合被附加的代数结构所充实(这样,从该类别到SET都有一个明智的健忘函子),尽管健忘函子映射,附加的代数结构仍可以区分两个对象它们都为空集,在这种情况下,它们之间可能没有同构。
答案 1 :(得分:3)
在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
是它自己的逆。