为什么反函数不暗示同构

Sib*_*ibi 5 haskell isomorphism

比方说,我有一个名为两个函数f :: a -> b,它的逆g :: b -> a这样f . g ? id.

现在不是g . f ? id吗?(因而暗示同构)

我试着写一个类似的例子并想出了这个:

myRead :: String -> Int
myRead = read

myShow :: Int -> String
myShow = show
Run Code Online (Sandbox Code Playgroud)

在ghci:

?> myRead . myShow $ 3
3
?> myShow . myRead $ "33"
"33"
Run Code Online (Sandbox Code Playgroud)

但似乎反函数并不意味着同构.所以有人能指出我在这里做错了吗?

J. *_*son 15

这是一个非常简单的例子.如果A是集合{1,2}B集合{1}那么函数:

f :: A -> B
f = const 1

g :: B -> A
g 1 = 1
Run Code Online (Sandbox Code Playgroud)

有关系,f . g = id但没有关系g . f = id.一个反例就是

g (f 2) = 1
Run Code Online (Sandbox Code Playgroud)

事实证明,如果你有两个功能,使得f . g = idg . 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
Run Code Online (Sandbox Code Playgroud)

另一个需要考虑的好处是每个函数都会f :: A -> B产生"反转图像"功能inv f :: B -> (A -> Bool).

inv :: Eq b => (a -> b) -> b -> a -> Bool
inv f b a = f a == b
Run Code Online (Sandbox Code Playgroud)

在更多数学术语中,逆图像函数是从域B的子域到子A集的A映射,使得每个这样的子集中的每个元素映射到相同的元素B.这些子集分区A(这是函数的定义).

如果我们有另一个功能,g :: B -> Ag b子集inv f b(即inv f b (g b) == True所有b),那么我们有

f . g == id
Run Code Online (Sandbox Code Playgroud)

但这远远弱于技术A而且B仅仅是同构的.这只是意味着g正在发送的元素B,以子集的A其中f将发送右后卫.

例如,它承认了一个有趣的空间"纤维化"概念.