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 !