为什么反函数不暗示同构

时间:2014-05-15 18:14:08

标签: haskell isomorphism

我们假设我有两个名为f :: a -> b的函数,它的反函数g :: b -> af . g ≡ id

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

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

myRead :: String -> Int
myRead = read

myShow :: Int -> String
myShow = show

在ghci:

λ> myRead . myShow $ 3
3
λ> myShow . myRead $ "33"
"33"

但似乎是inverse function doesn't imply isomorphism。所以有人能指出我在这里做错了吗?

3 个答案:

答案 0 :(得分:16)

这是一个非常简单的例子。如果设置A{1,2}B设置{1},那么功能为:{/ p>

f :: A -> B
f = const 1

g :: B -> A
g 1 = 1

具有关系f . g = id,但不具有关系g . f = id。一个反例是

g (f 2) = 1

事实证明,如果你有两个函数,例如f . g = idg . f = id那么就说明了很多关于这些函数的域和codomain的函数。特别是,它建立了一个同构,这表明这两个域在某种意义上是等价的。

从类别理论的角度来看,这意味着它们通过类别的态射无法区分。范畴理论强调类别的态射是获取物体信息的唯一途径,因此这种不可分辨性非常重要。

当你只有单方面的反转时,你仍然在学习这两个领域......但并不是说它们是同构的。


单面反转的一件事给你的是幂等的。幂等元是从域到自身的函数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 -> Ag b位于子集inv f b中(即所有inv f b (g b) == True都是b)那么我们就有

f . g == id

但这比AB仅仅是同构的更弱,更具技术性。这只是意味着gB的元素发送到A的子集,f将向后发送。

例如,它承认了一个有趣的概念"fibration"的空间。

答案 1 :(得分:3)

如果g :: X -> Y是满射的,则不一定有反向函数f :: Y -> X。然而,投射函数g可以反转某些函数f

g maps X to Y, which reverses some function f from Y to X, shown in orange

假设 y 中的每个Y x 中都有一个唯一值X f g 1}}发现。为 x 中的每个X指定一个函数y是可行的,{strong> Y < / strong>这样g . f == id。此语句显示所有x都存在唯一y,但这并未告知所有y存在唯一x的内容(即无法保证唯一性)。 (我甚至不知道g是如何建立的 - 你需要选择公理。)

答案 2 :(得分:2)

使用您自己的示例myRead . myShow ≡ id,但

(myShow . myRead) "0xFF" = "255"

所以myShow . myRead ≢ id,您也可以通过计数参数看到:

类型Int具有有限的多个值,而String具有无限多的值,因此虽然可以从Int转到String然后返回,但是从无限到对有限类型String输入Int必须丢弃信息,因此您无法始终返回原始字符串,因此无法在IntString之间构造同构{1}}。