Haskell 为什么';t反函数隐含同构
假设我有两个函数名为Haskell 为什么';t反函数隐含同构,haskell,isomorphism,Haskell,Isomorphism,假设我有两个函数名为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" 但看起来,这是一个错
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"
但看起来,这是一个错误。有人能告诉我我做错了什么吗?这是一个非常简单的例子。如果
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)
在更数学的术语中,逆图像函数是从编码域B
到域a
的子集的映射,使得a
的每个这样的子集中的每个元素映射到B
的相同元素。这些子集划分为A
(这是函数的定义)
如果我们有另一个函数g::B->A
,使得gb
在子集inv fb
中(即inv fb(gb)==True
表示所有B
),那么我们有
f . g == id
但这远比同构的A
和B
弱得多,技术性也强得多。这只意味着g
正在将B
的元素发送到A
的子集,而f
将立即发送回
例如,它接受了一个关于空间的完整有趣的概念。如果
g::X->Y
是满射的,那么就不一定有一个反函数f::Y->X
。然而,满射函数g
可以反转某些函数f
假设对于
y
中的每个y
,在x
中都有一个唯一的值x
,该值是f
找到的。可以指定一个函数g
,对于x
中的每个x
,在y
中找到y
,从而g。f==id
。此语句显示所有y
都存在唯一的x
,但这并不说明所有x
都存在唯一的y
(即不保证唯一性)。(我甚至没有提到g
是如何构建的——你需要选择公理)。用你自己的例子,myRead。秘秀≡ id
,但是
(myShow . myRead) "0xFF" = "255"
所以myShow。myRead≢ id
,您也可以通过计数参数看到这一点:
类型
Int
有有限多个值,而String
有无限多个值,因此虽然可以从Int
到String
再返回,但从无限类型String
到有限类型Int
必须放弃信息,因此,您不能总是返回原始字符串,因此不可能在Int
和string
之间构造同构。请考虑将Float
和Int
相互转换。因此,您本质上是通过B
中的映射来修改A
的元素,也就是说,如果A
的两个元素在B
中的图像相等,则认为它们相等,这就产生了一个微不足道的同构。这和纤维化有什么关系?我还不认为它们相等,但是,任何函数的逆映像都会产生其域的分区。分区形成等价关系,然后您可以考虑当将分区的等价关系作为事实时域发生了什么。这称为商集。纤维化是一种特殊情况,其中每个分区共享相同的形状,这将域划分为一束“纤维”。哦,是的!如果你在辅酶域的逆映像下取域的商群,那么商群是内射到辅酶域的。虽然在我的g
条件中默认地处理了A,但我省略了谈论A不能映射到所有B的函数。如果你最后注意到A是这个商的满射,你就会得到正则分解定理:所有函数都可以分解成满射、同构和注入(对于一些ppl来说,这可能更容易用图片)
(myShow . myRead) "0xFF" = "255"