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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:15:03