2016-10-23 2 views
0

Ich lerne OCaml aus dem MOOC von Université Paris Diderot angeboten. Im Moment habe ich keinen großen Kampf mit funktionalem Denken, aber ich finde diesen Code etwas hässlich. Wie kann ich es umgestalten, also kann ich allgemeine Auswertung von e1 und von e2 schreiben, die für zwei späteste Zweige der Übereinstimmungserklärung dient, die in der Vereinfachenfunktion eingeschlossen wird. Die Idee dieser Funktion besteht darin, e * 0 oder 0 * e in 0 umzuwandeln; e * 1 oder 1 * e in e; und e + 0 oder 0 + e in e.Refactor dieses Muster angepasst OCaml Stück Code

type exp = 
    | EInt of int 
    | EAdd of exp * exp 
    | EMul of exp * exp;; 

let eval expression = 
    let rec aux = function 
     | EInt x  -> x 
     | EAdd (e1, e2) -> (aux e1) + (aux e2) 
     | EMul (e1, e2) -> (aux e1) * (aux e2) 
    in aux expression;; 

let simplify expression = 
    match expression with 
     | EInt _  -> expression 
     | EAdd (e1, e2) -> 
      let v1 = eval e1 in 
      let v2 = eval e2 in 
       if v1 = 0 then e2 
       else if v2 = 0 then e1 
       else expression 
     | EMul (e1, e2) -> 
      let v1 = eval e1 in 
      let v2 = eval e2 in 
       if v1 = 0 || v2 = 0 then EInt 0 
       else if v1 = 1 then e2 
       else if v2 = 1 then e1 
       else expression;; 

Ich schätze Sie helfen! Danke!

Antwort

1

Ich denke, man eine Funktion wie diese haben:

let simplifyop identity zero exp e1 e2 = 
    let v1 = eval e1 in 
    let v2 = eval e2 in 
    if v1 = identity then e2 
    else if v2 = identity then e1 
    else 
     match zero with 
     | None -> exp 
     | Some z -> 
      if v1 = z || v2 = z then EInt z 
      else exp 

Dann schauen Sie Ihre Fälle wie folgt aus:

| EAdd (e1, e2) -> simplifyop 0 None expression e1 e2 
| EMul (e1, e2) -> simplifyop 1 (Some 0) expression e1 e2 
Verwandte Themen