Ich bin neu in OCaml und lese das Real World OCaml (RWO) Buch. Der Mustervergleich wird in Kapitel 3 beschrieben und scheint im Vergleich zu Erlangs (oder Prologs) Mustervergleich schwach zu sein.Warum ist OCamls Mustervergleich schwächer als Erlangs?
Meine Fragen sind:
- warum schwächer OCaml der Pattern-Matching?
- gibt es irgendwelche Vorteile zu OCamls Art des Musterabgleichs?
Ein konkretes Beispiel:
die folgende Funktion (. Genommen von RWO S. 63) destutters eine Liste
let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd' :: tl ->
if hd = hd' then ds1 (hd' :: tl)
else hd :: ds1 (hd' :: tl)
;;
# destutter [1;2;3;3;4;5;5;6];;
- : int list = [1; 2; 3; 4; 5; 6]
In Erlang wäre es möglich (und ich denke, bevorzugt) Muster verwenden anstelle der bedingten Anpassung:
destutter([]) -> [];
destutter([X]) -> [X];
destutter([H,H|T]) -> destutter([H|T]);
destutter([H|T]) -> [H | destutter(T)].
der Versuch, diese Art der Sache in OCaml ...
let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd :: tl -> destutter tl (* error *)
| hd :: tl -> hd :: destutter tl
;;
... löst einen Fehler auf der markierten Linie:
Error: Variable hd is bound several times in this matching
So Erlang/Prolog-Stil Pattern Matching in OCaml funktioniert nicht. Warum? Was sind die Vorteile des OCaml-Ansatzes?
Mit Dank und die besten Wünsche
Ivan
Sehr interessante Frage, ich muss unbedingt mehr über Erlang erfahren! –