2010-11-27 8 views
2

Falls ich einen Datentyp als variable Größe disassemblieren muss, kann ich immer noch "match und with" verwenden, und wenn die Antwort ja ist, könntest du mir helfen herauszufinden, wie (ich bin . ein Anfänger mit dieser Sprache), oder mich oder andere Methoden verwendenzum Zerlegen eines Datentyps ocaml

der Typ definiert ist dies:

type 'state formula = 
    | And  of 'state formula list 
    | Or  of 'state formula list 
    | Literal of bool 
    | Variable of 'state 

aus den Beispielen ich das gesehen habe „Spiel und mit“ verwendet wird, wenn die Struktur vom statischen Typ war, in meinem Fall so wie ich?

+2

Ich habe Probleme, die Frage zu verstehen und bin völlig nicht in der Lage, den letzten Satz zu parsen. Könnten Sie bitte umformulieren? Könntest du auch klarstellen, was du mit "disassemble" meinst? – sepp2k

+0

ein Beispiel ich habe: lassen Formel = Und [Variable "q0"; Oder [Variable "q1"; Variable "q2"]; Variable "q3"], muss ich Element für Element analysieren – kafka

+0

Mustererkennung, wenn in der Tat die richtige Lösung, aber da der Datentyp rekursiv ist, muss die Funktion, die es verarbeitet auch rekursiv sein. – delnan

Antwort

5

Also hier ist ein Beispiel, das match verwendet, um mit Ihrer Formel Art zu arbeiten:

type 'state formula = | And of 'state formula list | Or of 'state formula list | Literal of bool | Variable of 'state 

let rec count_vars form = match form with 
| And forms 
| Or forms -> List.fold_left (+) 0 (List.map count_vars forms) 
| Literal _ -> 0 
| Variable _ -> 1 

let formula = And [ Variable "q0"; Or[ Variable "q1";Variable "q2"]; Variable "q3"] 

let vars_in_formula = count_vars formula (* 4 *) 
+0

für den Fall "Und" gibt es keine Aktion – kafka

+1

@Antonio: Wenn Sie ein Muster haben, das nicht von '->' folgt, "fällt" durch zum nächsten Fall (vorausgesetzt beide Muster binden die gleichen Variablen). Mit anderen Worten, derselbe Ausdruck wird für das "And" - und das "Or" -Muster verwendet. – sepp2k

0

Wenn Sie den Typ ändern möchten, können Sie p verwenden Atter Matching (unter anderem, aber ich finde das am elegantesten). Es ist im Wesentlichen syntaktischer Zucker für Match mit.

Zum Beispiel:

let identify_formula=function 
And(l) -> 0 
|Or(l) -> 1 
|Literal(b) -> 2 
| Variable(v) -> 3;; 

Für ein weniger triviales Beispiel dafür, wie Arten zu manipulieren:

type l=Cons of int*l 
    | Nil;; 

let rec sum_l=function 
Cons(hd,tl)->hd+ sum_l(tl) 
| Nil-> 0;; 

sum_l(Cons(1,Cons(2,Cons(3,Nil))));; (*r6*) 
0

Vielleicht möchten Sie ein Codebeispiel an Ihre Bedürfnisse anpassen.

type 'state formula = 
    | Literal of bool 
    | And of 'state formula list 
    | Or of 'state formula list 
    | Variable of 'state 

let rec eval variable_env formula = 
    match formula with 
    | Literal b -> b 
    | Variable v -> variable_env v 
    | And formulas -> List.for_all (eval variable_env) formulas 
    | Or formulas -> List.exists (eval variable_env) formulas 

(* same as eval, different code *) 
let rec eval2 env = function 
    | Literal b -> b 
    | Variable v -> env v 
    | And [] -> true 
    | And (hd::tl) -> eval env hd && eval2 env (And tl) 
    | Or [] -> false 
    | Or (hd::tl) -> eval env hd || eval2 env (Or tl) 
Verwandte Themen