专栏名称: 程序人生
十年漫漫程序人生,打过各种杂,也做过让我骄傲的软件;管理过数十人的团队,还带领一班兄弟姐妹创过业,目前在硅谷一家创业公司担任 VP。关注程序人生,了解程序猿,学做程序猿,做好程序猿,让我们的程序人生精彩满满。
目录
相关文章推荐
腾讯技术工程  ·  0day漏洞量产?AI Agent“生产线”曝光 ·  19 小时前  
蚂蚁技术AntTech  ·  欢迎参加!蚂蚁SRC年度颁奖盛典&大模型安全交流会 ·  23 小时前  
大淘宝技术  ·  大模型微调知识与实践分享 ·  昨天  
伯乐在线  ·  HR ... ·  2 天前  
伯乐在线  ·  HR ... ·  2 天前  
极客之家  ·  22k star,微软硬核开源,让 ... ·  3 天前  
51好读  ›  专栏  ›  程序人生

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

程序人生  · 公众号  · 程序员  · 2019-06-16 07:39

正文

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



比如在 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






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