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 = 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
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 -> A
如g 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
将发送右后卫.
例如,它承认了一个有趣的空间"纤维化"概念.