Skip to content

Instantly share code, notes, and snippets.

@Tchou

Tchou/shape.ml Secret

Last active September 26, 2024 05:35
Show Gist options
  • Select an option

  • Save Tchou/6e16fa92a9d91cc91674ed6cd316179c to your computer and use it in GitHub Desktop.

Select an option

Save Tchou/6e16fa92a9d91cc91674ed6cd316179c to your computer and use it in GitHub Desktop.
Activité 1 : un type somme pour les formes
(* Le type des formes *)
type shape =
Triangle of float * float
| Square of float
| Rect of float * float
| Disk of float
| Ellipse of float * float
(* La fonction de calcul d'aire :
si on retire une des branches (par exemple "Rect (w, h) -> w *. h")
alors OCaml donne un warning indiquant qu'un cas n'est pas couvert
*)
let area s =
match s with
Triangle (base, height) -> base *. height *. 0.5
| Square side -> side *. side
| Rect (w, h) -> w *. h
| Disk r -> r *. r *. Float.pi
| Ellipse (r1, r2) -> r1 *. r2 *. Float.pi
(* Une fonction de normalisation. Attention,
il est dangereux de remplacer la la dernire ligne par:
| _ -> s
même si c'est correct.
En effet, si on ajoute un nouveau cas dans le type, avec
la fonction actuelle, le dernier cas ne sera pas traité et on
aura un warning qui nous forcer à mettre à jour la fonction pour
traiter explicitement ce dernier cas.
Si on met | _ -> s, alors tout nouveau cas sera absorbé par la
branche "joker" silencieusement
*)
let normalize s =
match s with
| Rect (r1, r2) -> if r1 = r2 then Square r1 else s
| Ellipse (r1, r2) -> if r1 = r2 then Disk r1 else s
| Triangle (_) | Square (_) | Disk (_) -> s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment