Surcharge en Caml pour calculer une espérance

Avec Caml, on est vite confronté au problème de surcharge des opérateurs arithmétique. Il y a pourtant un moyen d'y remédier. Il est instructif de lire par exemple cet article .
Je m'en suis inspiré pour calculer l'expérance d'une loi à valeurs entières ou flottantes:

OCaml
(* SURCHARGΕ EΝ CAML cf http://vernoux.fr/2011/11/17/la-surcharge-des-operateurs-en-objective-caml/ *)
 
(* obtenir le typage *)
let typage x =
    let tag_x = Obj.tag (Obj.repr x) in
        if tag_x = Obj.int_tag then "int"
        else if tag_x = Obj.string_tag then "string"
        else if tag_x = Obj.double_tag then "float"
        else "unknown";;
 
(* conversion vers le type flottant *)
let to_float x =
  let x_untyped = Obj.magic x
  and type_x = typage x in
  match type_x with
  | "int"   -> float (Obj.magic x_untyped)
  | "float" -> Obj.magic x_untyped
  | _ -> failwith "Je ne sais pas caster ça en float !";;
 
 
 
(* espérance *)
 
let esperance (dic: ('a * float) list): float =
  List.fold_left (fun acc cpl -> acc +. ((to_float (fst cpl)) *. snd cpl))  0.  dic;;

et hop !

OCaml
# esperance;;
- : ('a * float) list -> float = <fun>

courtesy of webmatter.de