Int是所有整数的类别吗?

时间:2018-01-30 11:56:51

标签: haskell category-theory

提案:每种类型都是一个类别。

例如:Int是Hask下所有integers的类别。

是这样的吗?

如果是这样,Int类别中的同态,或Int->Int中所有可能的态射是什么? 怎么定义它?

编辑

--In the category of Hask

--Imagine, I have Str category just of strings under Hask, then:

Obj(Str) is Singelton
Hom (Str) is each string
Composition operation is (++) operator --in Haskell

2 个答案:

答案 0 :(得分:10)

取决于“类型”和“是一个类别”的含义。如果你在编程语言中采用任何具体的类型,那么该类型只有很多可能的值,所以你可以只取所有值的集合,并说它是一个离散的类C,它什么都没有但身份态射。

整数可以通过多种不同方式被视为一个类别:

  • (Z,+,0)是一个组,因此一个特殊的groupoid具有单个对象(Obj(C) = {*}是唯一的对象,每个整数是一个态射,0是身份态射,+是作文)。
  • (Z,&lt; =)是部分有序的集合,posets是特殊的非常简单的类别。态射只是元素之间的无结构箭头,每对整数(a, b)都有一个箭头,a <= b。反身性a <= a是身份态射。及物性就是构成。
  • (Z,|)(可分性关系)又是一个poset,箭头再次简单地表示某个整数除了一些其他整数:a|b。同样,refl_a = a|a是身份态射,事实是如果a|bb|c然后a|c给出了构图。

如果您只对类型 Int感兴趣,也可以构建 其中有许多不同的类别:

  • 最简单的例子:将Int作为唯一的对象,将Int上的身份函数作为唯一的态射,完成。这是一个类别,通常称为1

  • 稍微简单的构造:Int上的内同态的幺半群。再次将Int作为您类别的唯一对象。将Hom[Int, Int]作为可在Haskell (1)中实现的所有终止总函数的集合,将此hom-set上的组合定义为函数的普通组合。

    < / LI>
  • 你可以稍微使用这个结构:例如,你可以考虑部分函数,​​或者只考虑可逆函数(这会产生一组自同构,因此是一个非常简单的类群)。

    < / LI>

还有许多其他方法来定义“与Int有某种关系”的类别。这取决于你想用它做什么。

关于你的'编辑':这只是每个幺半群都是一个具有单个对象的类别的特例。对于整数,你可以立即建立一些幺半群:

  • (Int, +, 0)a+b是作文,0是身份)
  • (Int, *, 1)a*b是作文,1是身份)
  • (Int, bitwise Xor, 0)a xor b是作文,0身份)
  • (Int, bitwise And, 0xF...F),类似
  • ...(几乎任何其他按位二进制操作)

你总是通过相同的结构从一个幺半群中获得一个类别:给定一个幺半群(M, op, zero),将无结构点{*}作为单个对象,取M作为一组态射,将zero作为标识,op作为合成,然后获取一个类别。这只是因为monoids 按照定义与具有单个对象的类别相同。

修改

(1)哦,等等,你需要类似于模数扩展性的等价类,否则f . idf不一样,并且即使没有整数溢出的“帮助”以及在真实计算机上发生的其他令人讨厌的事情,关联性也不会起作用。请注意,像“这样的属性的不可判断性是否会终止所有输入值?”“这两个函数是否会为所有输入返回相同的结果?”不会破坏公definedness。

答案 1 :(得分:1)

在你的编辑中,你已经确定了幺半群,它是具有一个对象的类别,其中同源集是幺半群的元素。

在任何两个对象之间也有至多一个箭头的类别,这些是部分订单。例如,在Int上:

  • 对象是整数。
  • x小于或等于y时,会出现从xy的箭头。
  • 构成只是传递属性。
  • 身份是反身性。

退化情况是任意两个对象(身份箭头除外)之间的零箭头的偏序,即所谓的离散类别