5

假设我有两个名为的函数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"

但似乎反函数并不意味着同构。那么有人可以指出我在这里做错了什么吗?

4

3 回答 3

16

这是一个非常简单的例子。如果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对于all ),那么我们有g binv f binv f b (g b) == Trueb

f . g == id

但这比同构要弱得多,技术性也A更强B。它只是意味着g将元素发送到其中将立即发送回来的B子集。Af

例如,它承认了一个关于空间“纤维化”的有趣概念。

于 2014-05-15T18:20:16.807 回答
3

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

g 将 X 映射到 Y,这将某些函数 f 从 Y 反转到 X,以橙色显示

假设每个yinY都有一个独特的x价值。指定一个函数,让每个这样的 in在这样的 中找到是可行的。该语句显示了 unique for all的存在,但这并没有说明所有 unique的存在(即不保证唯一性)。(我什至没有触及如何构建 - 你需要选择公理)。XfgxXyYg . f == idxyyxg

于 2014-05-15T18:28:31.427 回答
2

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

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

所以myShow . myRead ≢ id,你也可以通过计数参数看到这一点:

该类型Int具有有限多个值,而String具有无限多个值,因此虽然可以往返IntString但从无限类型String到有限类型Int必须丢弃信息,因此您不能总是回到原始字符串,因此不可能在 和 之间构造同IntString

于 2014-05-16T02:43:15.590 回答