Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么';t反函数隐含同构_Haskell_Isomorphism - Fatal编程技术网

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"