1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
(* différents types *)
type num = [`Float of float | `Int of int]
type 'a opp = [`Plus of 'a | `Moins of 'a]
type 'a func = [`Sin of 'a | `Cos of 'a]
(* pour récupérer la valeur flottante *)
let recup_float = function
| `Int x -> float_of_int x
| `Float x -> x
(* séparation de la fonction pour traiter les évaluation
de fonctions*)
let eval_fun eval = function
| `Sin x -> `Float (sin (recup_float (eval x)))
| `Cos x -> `Float (cos (recup_float (eval x)))
let apply_opp opp_int opp_float = function
| `Int x, `Int y ->
`Int (opp_int x y)
| `Int x, `Float y ->
`Float (opp_float (float_of_int x) y)
| `Float x, `Int y ->
`Float (opp_float x (float_of_int y))
| `Float x, `Float y ->
`Float (opp_float x y)
(* séparation de la fonction pour traiter les évaluation
d'application d'oppérateur*)
let eval_opp eval = function
| `Plus (x, y) ->
apply_opp (+) (+.) (eval x, eval y)
| `Moins (x, y) ->
apply_opp (-) (-.) (eval x, eval y)
(* utilisation des deux fonctions précédantes *)
let rec eval = function
| #num as r -> r
| #opp as opp -> eval_opp eval opp
| #func as func -> eval_fun eval func
(* début des exemples *)
let eval_affiche x = match eval x with
| `Int x -> print_int x; print_newline ()
| `Float x -> print_float x; print_newline ()
let un = `Int 1
let deux = `Float 2.
let s1 = `Sin (`Float 3.14159)
let o1 = `Plus (`Moins (un,s1), deux)
let o2 = `Moins (`Cos un, o1)
let _ = eval_affiche o2 |
Partager