Nach dem suggestion rekursive Datentypen für eine verschachtelte Struktur wie ein Baum zu verwenden Ich habe versucht, recsurive Datatyep in einem Testprogramm zu arbeiten, sondern stieß auf (noch eine, sehr kryptisch für mich) Fehler.Vereinheitlichung mit rekursiven Datentypen
Mein Programm ist dies:
datatype 'a tree =
Leaf of { value : 'a }
| Node of { value : 'a, left: 'a tree, right: 'a tree }
fun recursivetreebuilder a n =
if n = 0
then
Leaf a
else
Node (a, recursivetreebuilder(a, n-1), recursivetreebuilder(a, n-1))
So wird die Funktion soll einen binären Baum der Tiefe n
, aufzubauen, indem rekursiv selbst mit verringert n
s bis n
Aufruf ist 0.
Aber ich Ich bekomme diesen Fehler:
Can't unify {left: 'a tree, right: 'a tree, value: 'a} with {value: 'b} *
(Int32.int/int -> 'c) * (Int32.int/int -> 'c) (Field 1 missing) Found near if
<(n, 0) then Leaf(a) else Node(a, recursivetreebuilder(...), ......)
Mit rekursiven Datentypen sollte eine andere Vereinheitlichung iss gelöst werden wenn geschachtelte Listen verwendet werden. Vielleicht sollte ich sehen können, wo das Problem die Erklärung zu meiner anderen Frage gegeben hat, aber ich noch nicht.
Auf welches "Feld 1" bezieht sich der Compiler und warum kann es nicht vereinheitlichen, wenn rekursive Datentypen dazu dienen sollten, verschiedene "Untertypen" desselben Datentyps zu vereinheitlichen?
bearbeiten
mehrere der vorgeschlagenen Strukturen ausprobiert, aber immer noch Fehler bekommen. Zum Beispiel für
datatype 'a tree =
Leaf of 'a
| Node of 'a tree * 'a tree
fun recursivetreebuilder a n =
if n < 0
then
Leaf (a)
else
Node (recursivetreebuilder(a, n-1), recursivetreebuilder(a, n-1))
bekomme ich
val printList = fn : Int.int list -> unit
Error- in 'recon_bintree.sml', line 12.
Can't unify 'a with 'a * Int32.int/int (Type variable to be unified occurs in type) Found near if
<(n, 0) then Leaf(a) else
Node(recursivetreebuilder(a, ...), recursivetreebuilder(...))
Error- in 'recon_bintree.sml', line 12.
Can't unify 'a with 'a * Int32.int/int (Type variable to be unified occurs in type) Found near if
<(n, 0) then Leaf(a) else
Node(recursivetreebuilder(a, ...), recursivetreebuilder(...))
Error- in 'recon_bintree.sml', line 12.
Can't unify 'a tree with Int32.int/int -> 'b (Incompatible types) Found near if
<(n, 0) then Leaf(a) else
Node(recursivetreebuilder(a, ...), recursivetreebuilder(...))
Error- in 'recon_bintree.sml', line 12.
Can't unify 'a tree with Int32.int/int -> 'b (Incompatible types) Found near if
<(n, 0) then Leaf(a) else
Node(recursivetreebuilder(a, ...), recursivetreebuilder(...))
Exception- Fail "Static errors (pass2)" raised
Okay, ich verstehe ... mehr oder weniger. Ich habe versucht, Ihre zweite vorgeschlagene Struktur zu implementieren, aber ich bekomme immer noch Vereinheitlichungsfehler ... was fehlt mir dort? Ich habe die Frage aktualisiert. –
@lotolmencre: Tut mir leid. Du hattest noch ein anderes Problem, das ich nicht bemerkt hatte. Ich habe jetzt die Antwort aktualisiert, um beide Probleme zu erklären. (Und dieses Mal habe ich es getestet.) – ruakh
Danke, es ist jetzt klarer geworden. –