跳到主要内容

模式匹配

Pattern matching
检查数据的结构,并根据其结构执行不同的操作

通用的理解

很多语句中都有模式匹配
为了省时省力地理解
我们可以尝试抽象出一种语法
但其实不同情况语法是不一样的

注意这只是一个抽象的语法,或者说伪代码
并不表示实际的语法

有点类似于正则表达式或者if-else语句

pattern -> result
  • pattern:想要把数据匹配到的结构
  • result:当数据匹配该模式时要执行或返回的内容

模式

Pattern
其实我感觉翻译成“模板”更适合中文语境

-- 通配符模式 (_): 匹配任何值,但不进行绑定
f _ = "Any value"

-- 变量模式: 匹配任何值,并将其绑定到变量
f x = x + 1

-- 字面值模式: 匹配特定的常量值
isZero 0 = True
isZero _ = False

-- 构造函数模式: 匹配特定的数据构造函数及其值
data Maybe a = Nothing | Just a

isJust (Just _) = True
isJust Nothing = False

-- 记录模式: 匹配记录的构造函数,并绑定某些字段
data Person = Person { name :: String, age :: Int }

isAdult (Person { age = a }) = a >= 18

-- 元组模式: 匹配元组及其元素
fst' (a, _) = a -- 匹配任意元组,并将首元素绑定到变量

-- 列表模式: 匹配列表及其元素
head' (x:_) = Just x -- 匹配非空列表,并将首元素绑定到变量
head' [] = Nothing

-- @pattern(as pattern):匹配,并且将匹配的这个主体绑定到`@`前面的变量
someFunction p1@(x:xs) p2@(y:ys) = p1 ++ p2 -- 匹配两个非空列表,并将它们分别绑定到`p1`和`p2`,x和y分别绑定到它们的首元素,xs和ys分别绑定到它们的尾部