我们假设我有两个名为f :: a -> b
的函数,它的反函数g :: b -> a
为f . 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。所以有人能指出我在这里做错了吗?
答案 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 = id
和g . 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 -> A
,g b
位于子集inv f b
中(即所有inv f b (g b) == True
都是b
)那么我们就有
f . g == id
但这比A
和B
仅仅是同构的更弱,更具技术性。这只是意味着g
将B
的元素发送到A
的子集,f
将向后发送。
例如,它承认了一个有趣的概念"fibration"的空间。
答案 1 :(得分:3)
如果g :: X -> Y
是满射的,则不一定有反向函数f :: Y -> X
。然而,投射函数g
可以反转某些函数f
。
假设 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
必须丢弃信息,因此您无法始终返回原始字符串,因此无法在Int
和String
之间构造同构{1}}。