提案:每种类型都是一个类别。
例如: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
答案 0 :(得分:10)
取决于“类型”和“是一个类别”的含义。如果你在编程语言中采用任何具体的类型,那么该类型只有很多可能的值,所以你可以只取所有值的集合,并说它是一个离散的类C
,它什么都没有但身份态射。
整数可以通过多种不同方式被视为一个类别:
Obj(C) = {*}
是唯一的对象,每个整数是一个态射,0
是身份态射,+
是作文)。(a, b)
都有一个箭头,a <= b
。反身性a <= a
是身份态射。及物性就是构成。a|b
。同样,refl_a = a|a
是身份态射,事实是如果a|b
和b|c
然后a|c
给出了构图。如果您只对类型 Int
感兴趣,也可以构建
其中有许多不同的类别:
最简单的例子:将Int
作为唯一的对象,将Int
上的身份函数作为唯一的态射,完成。这是一个类别,通常称为1
。
稍微简单的构造:Int
上的内同态的幺半群。再次将Int
作为您类别的唯一对象。将Hom[Int, Int]
作为可在Haskell (1)中实现的所有终止总函数的集合,将此hom-set上的组合定义为函数的普通组合。
你可以稍微使用这个结构:例如,你可以考虑部分函数,或者只考虑可逆函数(这会产生一组自同构,因此是一个非常简单的类群)。
< / 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 . id
与f
不一样,并且即使没有整数溢出的“帮助”以及在真实计算机上发生的其他令人讨厌的事情,关联性也不会起作用。请注意,像“这样的属性的不可判断性是否会终止所有输入值?”和“这两个函数是否会为所有输入返回相同的结果?”不会破坏公definedness。
答案 1 :(得分:1)
在你的编辑中,你已经确定了幺半群,它是具有一个对象的类别,其中同源集是幺半群的元素。
在任何两个对象之间也有至多一个箭头的类别,这些是部分订单。例如,在Int
上:
x
小于或等于y
时,会出现从x
到y
的箭头。退化情况是任意两个对象(身份箭头除外)之间的零箭头的偏序,即所谓的离散类别。