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 C be a category with some objects X1 and X2. A product of X1 and X2 is an object X (often denoted X1 × X2) together with a pair of morphisms π1 : X → X1, π2 : X → X2 that satisfy the following universal property: for every object Y and pair of morphisms f1 : Y → X1, f2 : Y → X2 there exists a unique morphism f : Y → X1 × X2 such 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 C be a category and let X1 and X2 be objects in that category. An object is called the coproduct of these two objects, written X1 ∐ X2 or X1 ⊕ X2 or sometimes simply X1 + X2, if there exist morphisms i1 : X1 → X1 ∐ X2 and i2 : X2 → X1 ∐ X2 satisfying a universal property: for any object Y and morphisms f1 : X1 → Y and f2 : X2 → Y, there exists a unique morphism f : X1 ∐ X2 → Y such that f1 = f ∘ i1 and f2 = 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的更多相关文章

  1. Category Theory: 01 One Structured Family of Structures

    Category Theory: 01 One Structured Family of Structures 这次看来要放弃了.看了大概三分之一.似乎不能够让注意力集中了.先更新吧. 群的定义 \( ...

  2. 【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 ...

  3. [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; ...

  4. Spring学习笔记2——创建Product对象,并在其中注入一个Category对象

    第一步:创建Product类.在Product类中有对Category对象的set和get方法 package com.spring.cate; public class Product { priv ...

  5. Web API开发实例——对产品Product进行增删改查

    1.WebApi是什么 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET ...

  6. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  7. <<Differential Geometry of Curves and Surfaces>>笔记

    <Differential Geometry of Curves and Surfaces> by Manfredo P. do Carmo real line Rinterval I== ...

  8. 对话机器学习大神Yoshua Bengio(下)

    对话机器学习大神Yoshua Bengio(下) Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun ...

  9. <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== ...

随机推荐

  1. 帆软报表(FineReport)实现跨数据源父子查询(2阶段查询)

    问题描述: 在报表中需要查询多个系统多个数据源,且有一个数据源的入参是另一个数据源的返回值.所以当用户点击查询到展现报表数据这个过程中,需要先做父查询,查询出的结果在作为子查询. 实现方案: 方案一: ...

  2. Win10系统,开机后提示Desktp不可用的故障解决方法。

    WIN10桌面位置不可用的故障解决方法 今天电脑开机 (Win10系统).桌面空了,然后就蒙了. 系统并弹出以下框,如下图: 原因可能是因为昨天晚上熬夜测试脚本.网上下载的脚本大多都是有毒的.但是人懒 ...

  3. 利用正则表达式实现python强口令检测

    """ Chapter 7 模式匹配和正则表达式 1 用import re 导入正则表达式模块 2 用re.compile()函数创建一个Regex对象(记得使用原始字符 ...

  4. 20172306 2018-2019-2 《Java程序设计与数据结构》第九周学习总结

    20172306 2018-2019-2 <Java程序设计与数据结构>第九周学习总结 教材学习内容总结 无向图 图是由结点和这些结点之间的连接构成 就图来说,结点叫做顶点,结点之间的连接 ...

  5. redis设计原则

    基本原则 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key --->解决方法:  保证键名不冲突 ...

  6. oracle 12c centos 7 安装配置

    1,安装centos 7 安装 宿主机配置信息: 内存:8G 系统盘:30G swap分区:30G (笑了oracle安装自检不过) /u01(50G) :oracle安装目录 /u02(50G): ...

  7. 通过HashSet达到对象集去重的实现(jdk1.8)

    通过HashSet达到对象集去重的实现(jdk1.8) public class Contract { private String contractId; private String contra ...

  8. 【MyBatis-Spring】Mybatis和并入Spring框架

    1.参考书籍:<深入浅出MyBatis技术原理与实战> 2.知识基础:Spring.Mybatis.Spring MVC. 配置数据源 配置SqlSessionFactory SqlSes ...

  9. mysql 字段指定值靠前排序方法,多字段排序排序方法

    背景:SEO下选择某查询条件 查询展示信息为装修设计师以及设计师作品.设计师原型设计为:选择某风格 例如:简约,则列表出现拥有简约风格的设计师信息以及该设计师类型为简约的作品(3条靠前记录) 浏览原型 ...

  10. PostgreSQL uuid

    --执行一 create extension "uuid-ossp" --执行二 select uuid_generate_v4()