假设我有两个名为的函数f :: a -> b
,它的反函数g :: b -> a
是that 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"
但似乎反函数并不意味着同构。那么有人可以指出我在这里做错了什么吗?
这是一个非常简单的例子。如果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
,使得g b
在子集inv f b
(即inv f b (g b) == True
所有b
),那么我们有
f . g == id
但这远弱,比更多的技术A
和B
公正是同构的。这只是意味着g
将的元素发送B
到,A
这些元素的子集f
将立即发送回去。
例如,它接受了空间“纤维化”的整个有趣概念。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句