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

如何针对数据类型执行模式匹配?(附Haskell示例代码)

如何针对数据类型进行模式匹配?

在Haskell里,模式匹配是处理自定义代数数据类型的核心技巧之一,比直接用==做相等判断要更优雅直观,咱们拿你给出的示例来拆解说明:

首先看你写的原始代码:

data Fruit = Apple | Banana | Orange
isYellow :: Fruit -> Bool
isYellow x | x == Banana = True | otherwise = False

这种写法能跑通,但其实没用到Haskell最擅长的模式匹配特性。我们可以直接对Fruit的构造器做匹配,让代码逻辑更清晰:

data Fruit = Apple | Banana | Orange

-- 直接匹配构造器,代码简洁又直观
isYellow :: Fruit -> Bool
isYellow Banana = True  -- 明确匹配到Banana构造器时返回True
isYellow _      = False -- 下划线代表匹配所有其他情况,返回False

为什么模式匹配更值得用?

  • 可读性拉满:一眼就能看懂「输入是Banana就返回True,其他水果都返回False」,逻辑完全不需要额外解读。
  • 更安全:如果之后给Fruit加新的构造器(比如Lemon),编译器会直接提示你isYellow函数没覆盖所有情况,避免漏处理的bug。但用==的写法,编译器不会给这个提醒,很容易留下隐患。
  • 性能更优:模式匹配是Haskell编译器重点优化的方向,比运行时的相等判断效率更高。

再补个带参数的数据类型例子,帮你拓展理解:

data Shape = Circle Float | Rectangle Float Float

-- 用模式匹配提取构造器参数,直接计算面积
area :: Shape -> Float
area (Circle r) = pi * r ^ 2
area (Rectangle width height) = width * height

这里我们不仅匹配了不同的构造器,还直接把构造器带的参数(半径r、宽width、高height)提取出来用在函数体里,一步到位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:21