这是一个非常简单的例子。如果A
是集合{1,2}
和B
集合{1}
那么函数:
f :: A -> B
f = const 1
g :: B -> A
g 1 = 1
有关系f . g = id
但没有关系g . f = id
。一个反例是
g (f 2) = 1
事实证明,如果你有两个这样的函数,f . g = id
那么g . f = id
就说明了很多关于这些函数的域和共域的信息。特别是,它建立了一个同构,表明这两个域在某种意义上是等价的。
从范畴论的角度来看,这意味着它们无法通过范畴的态射来区分。范畴论强调范畴的态射是获取对象信息的唯一途径,所以这种不可区分性非常重要。
当你只有单向逆时,你仍然在学习很多关于这两个域的知识……但并不是说它们是同构的。
单向逆给你的一件事是幂等的。幂等是i
从域到自身的函数(自同态),使得i . i = i
. 给定任何两个函数,其中f . g = id
,g . f
是幂等的,并且证明非常明显:
i . i = (g . f) . (g . f) = g . f . g . f = g . (f . g) . f = g . f = i
要考虑的另一件好事是每个函数都会f :: A -> B
产生“反图像”函数inv f :: B -> (A -> Bool)
。
inv :: Eq b => (a -> b) -> b -> a -> Bool
inv f b a = f a == b
在更数学的术语中,逆图像函数是从共域B
到域子集的映射,A
使得每个这样的子集中的每个元素都A
映射到 的相同元素B
。这些子集分区A
(这是一个函数的定义)。
如果我们有另一个函数在子集中(即g :: B -> A
对于all ),那么我们有g b
inv f b
inv f b (g b) == True
b
f . g == id
但这比同构要弱得多,技术性也A
更强B
。它只是意味着g
将元素发送到其中将立即发送回来的B
子集。A
f
例如,它承认了一个关于空间“纤维化”的有趣概念。