typecolor=Red|Blacktype'atree=Empty|Treeofcolor*'atree*'a*'atreeletrebalancet=matchtwith|Tree(Black,Tree(Red,Tree(Red,a,x,b),y,c),z,d)|Tree(Black,Tree(Red,a,x,Tree(Red,b,y,c)),z,d)|Tree(Black,a,x,Tree(Red,Tree(Red,b,y,c),z,d))|Tree(Black,a,x,Tree(Red,b,y,Tree(Red,c,z,d)))->Tree(Red,Tree(Black,a,x,b),y,Tree(Black,c,z,d))|_->t(* the 'catch-all' case if no previous pattern matches *)
defhttp_error(status):matchstatus:case400:return"Bad request"case404:return"Not found"case418:return"I'm a teapot"case_:#省略此行及下一行以创造一个没有通配符的模式匹配return"Something's wrong with the Internet"
如果省略最后两行,当status为500时什么都不会发生。
同理,模式匹配也可用于class中:
classPoint:x:inty:intdeflocation(point):matchpoint:casePoint(x=0,y=0):print("Origin is the point's location.")casePoint(x=0,y=y):print(f"Y={y} and the point is on the y-axis.")casePoint(x=x,y=0):print(f"X={x} and the point is on the x-axis.")casePoint():print("The point is located somewhere else on the plane.")case_:print("Not a point")
和其他语言中的模式匹配一样,Python中也可以在匹配的语句中使用通配符:
matchtest_variable:case('warning',code,40):print("A warning has been received.")case('error',code,_):print(f"An error {code} occurred.")
^Turner, D. A. Some History of Functional Programming Languages(PDF). [2022-02-18]. (原始内容(PDF)存档于2020-04-15). John Darlington’s NPL, “New Programming Language”, developed with Burstall in the period 1973-5, replaced case expressions with multi-equation function definitions over algebraic types, including natural numbers, e.g. fib (0) <= 1 fib (1) <= 1 fib (n+2) <= fib (n+1) + fib (n) Darlington got this idea from Kleene’s recursion equations.
^Turner, D. A. Some History of Functional Programming Languages(PDF). [2022-02-18]. (原始内容(PDF)存档于2020-04-15). Miranda had, instead of conditional expressions, conditional equations with guards. Example: sign x = 1, if x>0 = -1, if x<0 = 0, if x=0 Combining pattern matching with guards gives a significant gain in expressive power. Guards of this kind first appeared in KRC, “Kent Recursive Calculator”(Turner 1981, 1982), a miniaturised version of SASL which I designed in 1980–81 for teaching.