Haskell中如何从嵌套data类型的Shape值中提取Size类型值
Haskell函数实现解答
最优实现方案
方案1:仅处理Circle类型输入(偏函数)
如果你能100%保证传入的Shape值永远是Circle构造的,不需要处理其他构造器的情况,可以直接用模式匹配提取Size,写法最简单,无额外性能开销:
getCircleSize :: Shape -> Size getCircleSize (Circle size) = size
注意:这个是偏函数,传入Rectangle类型的值时会触发运行时匹配错误,仅适合输入范围完全可控的场景使用。
方案2:兼容所有Shape输入的安全实现(总函数)
这是更符合Haskell最佳实践的写法,覆盖所有合法输入情况,避免运行时崩溃:
getShapeSize :: Shape -> Maybe Size -- 提取Circle包裹的Size getShapeSize (Circle size) = Just size -- 提取Rectangle中Sharp构造器包裹的Size getShapeSize (Rectangle (Sharp size)) = Just size -- Rectangle的Blunt构造器无对应Size,返回空 getShapeSize (Rectangle Blunt) = Nothing
这个实现的优势:
- 是总函数,所有
Shape类型的合法输入都有对应的返回值,不会出现运行时错误 - 时间复杂度为O(1),无额外计算开销
- 如果你后续需要从
Rectangle Sharp取值也不需要修改函数结构,扩展性更好
内容的提问来源于stack exchange,提问作者user15263733
相关产品推荐
相关产品推荐

