Haskell自定义Tag类型如何非硬编码生成符合要求的列表
Haskell 非硬编码生成Tag列表方案
你可以通过列表推导式或者列表枚举+映射的方式生成目标列表,完全不需要逐个硬编码Tag元素。
首先先给你的Tag类型加上Show实例方便调试查看结果:
data Tag = Tag Char Int deriving (Show, Eq) -- Eq可选,按需添加即可
全范围笛卡尔积生成(AD每个字符对应13)
如果你需要每个字母都对应完整的1~3数值,直接用列表推导式即可:
fullTagList :: [Tag] fullTagList = [Tag char num | char <- ['A'..'D'], num <- [1..3]]
生成结果和你举例的结构完全一致:[Tag 'A' 1, Tag 'A' 2, Tag 'A' 3, Tag 'B' 1, Tag 'B' 2, Tag 'B' 3, ..., Tag 'D' 3]
自定义范围生成(匹配你示例里的部分截断逻辑)
如果你需要不同字符对应不同的数值范围,比如B只到2、D从2开始,可以用映射+拼接的方式实现:
customTagList :: [Tag] customTagList = concat [ Tag 'A' <$> [1..3] , Tag 'B' <$> [1..2] , Tag 'C' <$> [1..3] , Tag 'D' <$> [2..3] ]
这里用<$>(也就是fmap)替代map写法更简洁。
- 核心逻辑说明:
- 字符范围直接用
['A'..'D']枚举,Haskell的Char类型支持区间枚举,不需要手动写所有字符 - 数值范围用
[m..n]枚举,修改范围只需要调整起止数值即可 - 两者的组合要么用列表推导式做笛卡尔积,要么针对每个字符单独指定数值范围再拼接,灵活度很高,完全不需要硬编码单个Tag元素
- 字符范围直接用
内容的提问来源于stack exchange,提问作者Xuanjian Zhang
相关产品推荐
相关产品推荐

