# Pattern Matching Examples

Here are many examples of how to use patterns with data:

(* Pokemon types *)
type ptype =
TNormal | TFire | TWater

(* A record to represent Pokemon *)
type mon = {name: string; hp : int; ptype: ptype}

(*********************************************
* Several ways to get a Pokemon's hit points:
*********************************************)

(* OK *)
let get_hp m =
match m with
| {name=n; hp=h; ptype=t} -> h

(* better *)
let get_hp m =
match m with
| {name=_; hp=h; ptype=_} -> h

(* better *)
let get_hp m =
match m with
| {name; hp; ptype} -> hp

(* better *)
let get_hp m =
match m with
| {hp} -> hp

(* best *)
let get_hp m = m.hp

(**************************************************
* Several ways to get the 3rd component of a tuple
**************************************************)

(* OK *)
let thrd t =
match t with
| (x,y,z) -> z

(* good *)
let thrd t =
let (x,y,z) = t in z

(* better *)
let thrd t =
let (_,_,z) = t in z

(* best *)
let thrd (_,_,z) = z

(*************************************
* How to get the components of a pair
*************************************)

let fst (x,_) = x
let snd (_,y) = y

(* both fst and snd are functions already provided in the standard library *)