You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中Plant类型存活判断函数的更优实现方式咨询

更简洁实现Haskell Plant类型的isPlantAlive函数

这里有两种更简洁的实现方式,解决你重复匹配构造器的冗余问题:

方法1:提取生命值的辅助函数

先定义一个辅助函数统一获取所有植物的生命值,再基于它实现存活判断逻辑:

getHealth :: Plant -> Int
getHealth (Peashooter h) = h
getHealth (Sunflower h) = h
getHealth (Walnut h) = h
getHealth (CherryBomb h) = h

isPlantAlive :: Plant -> Bool
isPlantAlive = (> 0) . getHealth

后续新增植物类型时,只需要给getHealth补充一行构造器匹配,isPlantAlive完全不需要改动。

方法2:用记录语法定义数据类型

修改你的Plant类型定义,给每个构造器添加同名的记录字段,Haskell会自动生成health函数用于提取生命值:

data Plant = Peashooter { health :: Int } 
           | Sunflower { health :: Int } 
           | Walnut { health :: Int } 
           | CherryBomb { health :: Int } 
           deriving (Show, Eq, Ord)

isPlantAlive :: Plant -> Bool
isPlantAlive = (> 0) . health

这种写法更符合Haskell的惯用风格,后续扩展植物类型时,只要保持health字段名一致,isPlantAlive无需任何修改。

你之前尝试的(Plant health)匹配无效,核心原因是Plant是类型名称,而模式匹配只能针对具体的构造器(比如Peashooter、Sunflower这类),类型本身不能用于模式匹配。

内容的提问来源于stack exchange,提问作者MGR4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:12:26