Product and Sum in Category Theory
Even if you are not a functional programmer, the notion of product type should be familiar to you, e.g., Pair<A, B> in Java is a product type of A and B. But the definition in category theory is not that easy to comprehend. Here is how it is defined on Wikipedia:
Let
Cbe a category with some objectsX1andX2. A product ofX1andX2is an objectX(often denotedX1 × X2) together with a pair of morphismsπ1 : X → X1,π2 : X → X2that satisfy the following universal property: for every objectYand pair of morphismsf1 : Y → X1,f2 : Y → X2there exists a unique morphismf:Y → X1 × X2such that the following diagram commutes:
Why is it defined that way and how do we interpret it? Let me translate it into something that Java programmers can understand. The definition actually says, if X1 x X2 is a product type of X1 and X2 with two functions π1 : X -> X1 and π2 : X -> X2, there must be a unique function f : Y -> X1 × X2 which satisfies the property: for any value y of type Y, function f1 : Y -> X1 and a function f2 : Y -> X2, the equations π1(f(y)) == f1(y) and π2(f(y)) == f2(y) must always be true.
In other words, if I define my product type as usual like:
// Java
class Pair<X1, X2> {
private final X1 x1;
private final X2 x2;
public Pair(X1 x1, X2 x2) {
this.x1 = x1;
this.x2 = x2;
}
public X1 getX1() {
return x1;
}
public X2 getX2() {
return x2;
}
}
There must be a unique f which is constructed by:
// Java
Function<Y, Pair<X1, X2>> makeF(Function<Y, X1> f1, Function<Y, X2> f2) {
return (Y y) -> new Pair(f1.apply(y), f2.apply(y));
}
In other words, product type guarantees that if you have a function of type Y -> X1 and a function of type Y -> X2, you must have a unique function of type Y -> X1 x X2 satisfying the property. The property can be expressed programatically as: for any y, f1 and f2, the following test must pass.
// Java
void testProductType(Y y, Function<Y, X1> f1, Function<Y, X2> f2) {
Function<Y, Pair<X1, X2>> f = makeF(f1, f2);
assert(f.apply(y).getX1() == f1.apply(y));
assert(f.apply(y).getX2() == f2.apply(y));
}
So what could be a counterexample? Here is:
// Java
class Pair<X1, X2> {
private final X1 x1;
private final X2 x2;
public Pair(X1 x1, X2 x2) {
this.x1 = x1;
this.x2 = x2;
}
public X1 getX1() {
return 1;
}
public X2 getX2() {
return 2;
}
}
With this wrong definition of product type, you cannot possibly construct such a f which satisfies the universal property, i.e., there are always some cases which can make the test fail.
If you think it is done, here comes the tricky part, is the type below a product type?
// Java
class Pair<X1, X2> {
private final X1 x1;
private final X2 x2;
public Pair(T x1, U x2) {
this.x1 = x1;
this.x2 = x2;
}
public T getX1() {
return x1 + 1;
}
public T getX2() {
return x2 + 2;
}
}
Intuition may tell you it is not a product type, but by definition of product type in the category theory, it actually is. Why? Because you can define a unique f satisfying the property:
// Java
Function<Y, Pair<X, Y>> makeF(Function<Y, X1> f1, Function<Y, X2> f2) {
return (Y y) -> new Pair(f1.apply(y) - 1, f2.apply(y) - 2);
}
What this means is that, the two product types are equivalent in category theory. This is because category theory defines equivalence by structure, if two things have the same structure, they are considered the same thing.
Then, what about sum type (a.k.a coproduct type)? The definition in category theory is:
Let
Cbe a category and letX1andX2be objects in that category. An object is called the coproduct of these two objects, writtenX1 ∐ X2orX1 ⊕ X2or sometimes simplyX1 + X2, if there exist morphismsi1 : X1 → X1 ∐ X2andi2 : X2 → X1 ∐ X2satisfying a universal property: for any objectYand morphismsf1 : X1 → Yandf2 : X2 → Y, there exists a unique morphismf : X1 ∐ X2 → Ysuch thatf1 = f ∘ i1andf2 = f ∘ i2. That is, the following diagram commutes:
From program perspective, the definition says, if X1 ∐ X2 is a sum type of X1 and X2 with two functions i1 : X1 -> X1 ∐ X2 and i2 : X2 → X1 ∐ X2, there must be a unique function f : X1 ∐ X2 -> Y which satisfies the property: for any value y : Y, function f1 : X1 -> Y and function f2 : X2 -> Y, the equations f(i1(y)) == f1(y) and f(i2(y)) == f2(y) must always be true.
If I define sum type as below:
// Java
class Either<X1, X2> {
private final Optional<X1> x1;
private final Optional<X2> x2;
private Either(Optional<X1> x1, Optional<X2> x2) {
this.x1 = x1;
this.x2 = x2;
}
public static Either<X1, X2> left(X1 x1) {
return new Either(Optional.of(x1), Optional.absent());
}
public static Either<X1, X2> right(X2 x2) {
return new Either(Optional.absent(), Optional.of(x2));
}
public Optional<T> getX1() {
return x1;
}
public Optional<U> getX2() {
return x2;
}
}
There must be a unique f which is constructed by:
// Java
Function<Either<X1, X2>, Y> makeF(Function<X1, Y> f1, Function<X2, Y> f2) {
return (Either<X1, X2> e) -> e.getX1().isPresent() ? f1.apply(e.getX1().get()) : f2.apply(e.getX2().get());
}
In other words, sum type guarantees that if you have a function of type X1 -> Y and a function of type X2 -> Y, you must have a unique function of type X1 ∐ X2 -> Y satisfying the property. The property can be verified programatically as: for any x1, x2, f1, f2 the following tests must pass.
// Java
void testSumType(X1 x1, X2 x2, Function<X1, Y> f1, Function<X2, Y> f2) {
assert(f.apply(Either.left(x1)) == f1.apply(x1));
assert(f.apply(Either.left(x2)) == f2.apply(x2));
}
To sum up, category theory defines product and sum type by requiring them to be able to construct such a function which satisfies a universal property.
Product and Sum in Category Theory的更多相关文章
- Category Theory: 01 One Structured Family of Structures
Category Theory: 01 One Structured Family of Structures 这次看来要放弃了.看了大概三分之一.似乎不能够让注意力集中了.先更新吧. 群的定义 \( ...
- 【leetcode】1281. Subtract the Product and Sum of Digits of an Integer
题目如下: Given an integer number n, return the difference between the product of its digits and the sum ...
- [Leetcode] 5279. Subtract the Product and Sum of Digits of an Integer
class Solution { public int subtractProductAndSum(int n) { int productResult = 1; int sumResult = 0; ...
- Spring学习笔记2——创建Product对象,并在其中注入一个Category对象
第一步:创建Product类.在Product类中有对Category对象的set和get方法 package com.spring.cate; public class Product { priv ...
- Web API开发实例——对产品Product进行增删改查
1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- <<Differential Geometry of Curves and Surfaces>>笔记
<Differential Geometry of Curves and Surfaces> by Manfredo P. do Carmo real line Rinterval I== ...
- 对话机器学习大神Yoshua Bengio(下)
对话机器学习大神Yoshua Bengio(下) Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun ...
- <Differential Geometry of Curves and Surfaces>(by Manfredo P. do Carmo) Notes
<Differential Geometry of Curves and Surfaces> by Manfredo P. do Carmo real line Rinterval I== ...
随机推荐
- MAC终端如何使用rar和unrar
一.MAC具体安装见下面两个博客分享: Homebrew介绍和使用:https://www.jianshu.com/p/de6f1d2d37bf Mac 压缩 / 解压缩工具解决方案:https:// ...
- centos 7.4安装python3.7.4
转自https://www.cnblogs.com/zhanglong8681/p/8421512.html 1.下载安装包 Linux下默认系统自带python2.7的版本,这个版本被系统很多程序所 ...
- oracle中的exists 和 in 用法详解
以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...
- EventEmitter事件处理器中的this问题
JavaScript中的this是一个比较绕的问题,有非常非常多的文章在讲这件事,这里推荐一篇文章,看了这篇文章基本上就能弄明白了. 这篇文章讲了关于this的一个基本原则: 包含this的Funct ...
- xx星空面试题
一面 1.什么是多态 实现原理? 2.什么是重载?class加载原理? 3.常用设计模式,简单介绍 4.看过哪些java的书?android的书? 5.动态注册静态注册 优缺点?静态注册函数如何被调用 ...
- docker使用代理(测试docker 17.06)
环境:debian9 service docker stop sudo HTTP_PROXY=http://127.0.0.1:1080 dockerd sudo docker pull gcr.io ...
- [二分答案][NOIP2015]跳石头
跳石头 题目描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起 ...
- android studio 模拟器不能使用的解决方案
1.安装模拟器的时候 AS提示是 VT -x is disable 进入电脑的 bios 系统设置,怎么进入--> 在开机的时候点击F2(华硕电脑,不同电脑方式不同) --在“configura ...
- Electorn(桌面应用)自动化测试之Java+selenium实战例子
基于electorn的桌面应用,网上相关资料较少.所有记录一下.使用java+selenium+testng对该类型应用的自动化测试方法. 代码样例 package com.contract.web. ...
- 一次HTTP请求响应涉及了哪些?
HTTP请求和响应步骤 TCP/IP协议 TCP三次握手 HTTP协议 HTTP请求报文 HTTP响应报文 TCP四次挥手 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤,下面从T ...