Ich habe einen local
Block mit wenigen Hilfsmethoden. Danach kommt eine Hauptfunktion (zwischen dem in
und end
Block):Warum "in" durch "let" in sml ersetzen?
datatype color = BLACK | RED;
datatype 'a RBTree = Nil
| Br of (int * 'a * color) * 'a RBTree * 'a RBTree;
datatype Balance = RR | LR | LL | RL;
exception NotFound;
local
fun max (num1, num2) ...
fun get_hight ...
fun get_balance_factor ...
fun LL_rotate ...
fun LR_rotate ...
fun RR_rotate ...
fun RL_rotate ...
fun balance_tree (Nil) = (Nil)
| balance_tree (Br(node, Nil, Nil)) = (Br(node, Nil, Nil))
| balance_tree (Br(node, left, right)) =
if (get_balance_factor (Br(node, left, right))) = 2 then
if (get_balance_factor left) = ~1 then (* LR *)
LR_rotate (Br(node, left, right))
else if (get_balance_factor left) > ~1 then (* LL *)
LL_rotate (Br(node, left, right))
else if (get_balance_factor Br(node, left, right)) = ~2 then
if (get_balance_factor right) = 1 then (* RL *)
RL_rotate (Br(node, left, right))
else if (get_balance_factor right) < 1 then (* RR *)
RR_rotate (Br(node, left, right))
else (Br(node, left, right))
in
fun insert ((Nil), item) = Br(item, (Nil), (Nil))
| insert ((Br(node, left, right)), item) =
if (#1(node) = #1(node)) then
(Br(item, left, right))
else if (#1(node) < #1(node)) then
balance_tree (Br(node, insert(left, item), right))
else
balance_tree (Br(node, left, insert(right, item)))
end;
wo die ...
für die Umsetzung steht. Und insert
ist die "Haupt" -Funktion. SML gibt mir diese Ausgabe:
- use "ex4.sml";
[opening ex4.sml]
datatype color = BLACK | RED
datatype 'a RBTree = Br of (int * 'a * color) * 'a RBTree * 'a RBTree | Nil
datatype Balance = LL | LR | RL | RR
exception NotFound
ex4.sml:58.1-58.3 Error: syntax error: replacing IN with LET
ex4.sml:69.1 Error: syntax error found at END
uncaught exception Compile [Compile: "syntax error"]
raised at: ../compiler/Parse/main/smlfile.sml:15.24-15.46
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:296.17-296.20
Ich verstehe nicht, warum sollte ich in
mit let
ersetzt werden?
Diese Fehlermeldung ist kein Vorschlag - es ist ein Zeichen, dass der Compiler durch Ihren Code verwirrt ist. Etwas führte zu der Schlussfolgerung, dass Sie eine "Let ... in" -Konstruktion versuchten, aber es fand "in", wo es ein "Let" - oder etwas in dieser Richtung - erwartete. Compiler-Syntaxfehlermeldungen sind in der Regel undurchschaubar. Das eigentliche Problem ist wahrscheinlich in den Auslassungspunkten in 'fun balance_tree ... 'versteckt. Vielleicht sollten Sie mehr vom relevanten Code zeigen. –
@JohnColeman Ich habe den Code für 'balance_tree' hinzugefügt, ich denke du hast Recht, denn wenn ich diese Funktion auskommentiere, scheint der Code in Ordnung zu sein, ich konnte nicht finden, was damit falsch ist – ThunderWiring
Es scheint, als ob du es nicht tust habe genug "else" -Klauseln. Sie haben 6 'if', 6' dann', aber nur 4' else'. –