2017-03-07 3 views
0

Lasst uns sagen, ich habe eine n-äre BaumtypOcaml - match n-ary_tree mit leeren Baum

type tree = Node of (char*tree) list ref;; 

und diese entsprechen dem leeren Baum

let empty_tree()= Node(ref[]);; 

Ich versuche, ein zu schreiben Funktion, sieht nur, wenn mein Baum leer ist oder nicht, wie

let checkIsEmpty t = match t with empty_tree-> print_string "tree is empty";; 

Aber wenn ich checkIsEmpty empty_tree;; schreiben sie es nur eine Einheit zurückkehren, wird nicht print "Baum ist leer"

Ich habe auch versucht, auf diese Weise

let checkisEmpty t = match t with z when z = empty_tree-> print_string "tree is empty";; 

Leider ohne Erfolg.

Wie kann ich aussehen, wenn mein Baum leer ist? Ich möchte die Übereinstimmung behalten und die Art, wie Baum deklariert wird (Leer ist nicht Teil des Typs ..), wenn möglich.

Danke!

Antwort

0

Sie müssen wahrscheinlich den Ausgang spülen, um es zu sehen. Sie können dies schreiben:

print_string "tree is empty"; flush stdout 

Ihr erstes Spiel funktioniert jedoch nicht. Jeder Bezeichner in einem Muster führt eine neue Variable ein. Die Variable empty_tree in Ihrer ersten Implementierung stimmt also immer mit dem Baum überein, den Sie an Ihre Funktion übergeben. (Oder in der Tat wird es jeden Wert übereinstimmen.)

Die zweite Implementierung sollte ein wenig besser funktionieren, sobald Sie flush stdout hinzufügen, und vorausgesetzt, es gibt einen globalen Wert empty_tree, die eine leere Struktur ist. Aber Sie sollten auch einen Fall hinzufügen, der übereinstimmt, wenn der Baum nicht leer ist; Andernfalls erhalten Sie eine Ausnahme für diesen Fall.

Darüber hinaus ist Ihre empty_tree eine Funktion, die einen leeren Baum zurückgibt. Es ist kein leerer Baum selbst (wie Ihr neuer Code annimmt).

(ich würde vorschlagen, dass Sie nicht Ihre Frage, nachdem es zu viel verlangt ändern. Es macht es schwer, eine Antwort zu schreiben, die dem entspricht, was Sie gefragt.)

+0

Danke für die Antwort, ja, ich weiß, ich sollte ein tun Fall für, wenn es nicht leer ist, aber für jetzt versuche ich nur, meinem Baum zu entsprechen, wenn der Baum, der in meiner Funktion übergeben wurde, gleich dem empty_tree ist, versuchte ich das flush stdout, aber es funktioniert auch nicht :((Ich versuchte mit dem "when" Schlüsselwort) – anthomaxcool

+0

Ich mache buchstäblich checkisEmpty empty_tree, und in der Funktion schaue ich ob t (was in diesem Fall leer ist) gleich leer ist und es wird nicht aufschreiben "Baum ist leer" Wenn ich eine Groß-/Kleinschreibung hinzufüge, etwas wie '| _ -> Print_string" nicht leer "; flush stdout', wird es nicht gedruckt – anthomaxcool

+0

(Beachte wieder, dass deine' empty_t Ree ist eine Funktion, kein Baum.) Vielleicht haben Sie nur Probleme, überhaupt eine Ausgabe zu erhalten. Was passiert, wenn Sie dies nur ausführen: 'print_string 'testing 1 2 3 \ n"; flush stdout' Als weiteren Seitenkommentar ist es einfacher, die Ausgabe zu sehen, wenn Sie mit '" \ n "' enden, sonst kann es verloren gehen. –