专栏名称: 程序人生
十年漫漫程序人生,打过各种杂,也做过让我骄傲的软件;管理过数十人的团队,还带领一班兄弟姐妹创过业,目前在硅谷一家创业公司担任 VP。关注程序人生,了解程序猿,学做程序猿,做好程序猿,让我们的程序人生精彩满满。
目录
相关文章推荐
京东零售技术  ·  前沿论文分享 | ... ·  2 天前  
OSC开源社区  ·  苹果开源编程语言Swift官网全新改版 ·  2 天前  
OSC开源社区  ·  苹果用Swift重写每天数十亿次请求的Jav ... ·  昨天  
京东科技技术说  ·  JDK从8升级到21的问题集 ·  2 天前  
稀土掘金技术社区  ·  协程中使用 ... ·  4 天前  
51好读  ›  专栏  ›  程序人生

沅有芷兮:类型系统的数学之美

程序人生  · 公众号  · 程序员  · 2019-06-15 07:04

正文

请到「今天看啥」查看全文



比如在 rust 里,我们可以这样为一个 user 建模:

struct User {  username: String,  nickname: String,  email: String,  email_verified: bool,}

这个 User 类型的集合的取值范围,就是它内部的所有类型的笛卡尔积。

sum type

笛卡尔积固然能帮助我们构建各式各样的复合类型,但它无法描述这样的场景:我们想为 User 添加一个 payment 的类型,它可以是信用卡,现金,微信,以及 ABT 其中的一种。自然,我们可以这样描述:

enum Payment {  Creditcard,  Cash,  Wechat,  Abt,}

但这样的类型并不完备 —— 如果用户选择了信用卡,那么需要信用卡号,过期时间,持卡人等信息,而选择 ABT,则需要钱包地址及其公钥。这该怎么办?我们需要类似于这样的类型:

Creditcard(CreditcardType) | Cash(f64) | ... | Abt(WalletType)

在集合论中,这被称作 disjoint union(不相交集),表述为 A + B。如图:


不相交集在数据类型中往往被称作 tagged union (C++) 或者 sum type (haskell, rust)。和 product type 相反的是,大部分编程语言没有 sum type。我们看 rust 是如何使用 sum type 来解决上面的问题的:

struct CreditcardInfo {  number: String,  expiration: chrono::NaiveDate,  holder: String,}
struct WalletType {






请到「今天看啥」查看全文