在Haskell中如何创建包含自定义代数数据类型所有取值的列表
Haskell 实现枚举类型及全量取值列表
你的需求完全可以实现,不需要专门定义返回列表的函数,直接定义顶层常量即可。
可行的两种实现方式
1. 朴素手写全量列表
你最开始的写法只需要补全类型签名或者正确的绑定语法就能正常运行,适合构造子数量少且固定的场景:
data OneToTen = I | II | III | IV | V | VI | VII | VIII | IX | X deriving (Show, Eq) setOneToTen :: [OneToTen] setOneToTen = [I, II, III, IV, V, VI, VII, VIII, IX, X]
这种写法的问题是构造子数量多的时候容易漏写,后续修改构造子也要同步改列表内容,维护成本高。
2. 派生类型类的优雅实现(你找到的方案是标准写法)
通过为代数类型派生Enum类型类,就能直接用Haskell的区间语法生成全量枚举列表,不需要手动逐个写构造子,是Haskell社区的惯用写法:
data OneToTen = I | II | III | IV | V | VI | VII | VIII | IX | X deriving (Enum, Show) setOneToTen :: [OneToTen] setOneToTen = [I .. X]
如果想要进一步提升扩展性,还可以额外派生Bounded类型类,哪怕后续增删构造子也不需要修改列表定义:
data OneToTen = I | II | III | IV | V | VI | VII | VIII | IX | X deriving (Enum, Bounded, Show, Eq) setOneToTen :: [OneToTen] setOneToTen = [minBound .. maxBound]
额外提示
派生Enum后你还可以直接用fromEnum和toEnum做OneToTen类型和Int序号的映射,派生Eq和Ord可以支持相等判断、排序等操作,方便后续做映射、过滤等处理。
内容的提问来源于stack exchange,提问作者CoffeeKid
相关产品推荐
相关产品推荐

