You need to enable JavaScript to run this app. 如何在Python中便捷实现Haskell风格的sum类型?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 05:36:03