如何在Python中便捷实现Haskell风格的sum类型?
Python中实现等价于Haskell简单无参求和类型的便捷方案
原Haskell定义的核心语义:
声明了一个名为Owner的封闭求和类型,仅包含两个无参数的构造子Me、You;所有合法的Owner取值只能是这两个构造子对应的全局单例实例,无法从外部新增其他符合类型的取值。
最便捷的零依赖实现:基于标准库enum.Enum
Python 3.4及以上版本内置的Enum枚举类型,天然适配这种无参构造的封闭枚举式sum类型,不需要安装任何第三方包,写法简洁清晰:
from enum import Enum, auto class Owner(Enum): # 使用auto自动分配内部取值,避免手动填写冗余的重复值 Me = auto() You = auto()
该实现和原Haskell类型的特性匹配点
- 类型封闭:所有合法的
Owner类型值仅为Owner.Me和Owner.You两个枚举成员,无法在类定义外部构造新的Owner实例,和Haskell的类型约束完全一致 - 单例特性:两个枚举成员都是全局唯一的对象,和Haskell无参构造子的单例行为匹配,等值判断完全可靠
- 生态适配:可以直接配合Python的类型标注系统、静态类型检查器使用,在Python 3.10+版本中还能和
match-case语法结合,实现和Haskell模式匹配体验接近的分支逻辑,示例:def get_possessive(owner: Owner) -> str: match owner: case Owner.Me: return "我的" case Owner.You: return "你的"
常见不推荐写法说明
- 用硬编码字符串约定取值(比如用
"me"/"you"代表Owner类型)的方式,没有封闭性约束,容易出现拼写错误,也无法被静态类型检查器识别潜在问题,和原Haskell类型的语义不等价 - 如果需要实现带参数的复杂sum类型,可以选用专门的ADT第三方库,但针对本题中两个无参构造子的简单类型,内置Enum的方案已经足够轻便、维护成本最低
内容的提问来源于stack exchange,提问作者dmvianna
相关产品推荐
相关产品推荐

