Sono nuovo di OCaml e sto leggendo il libro Real World OCaml (RWO). La corrispondenza del modello è descritta nel capitolo 3 e sembra debole rispetto alla corrispondenza del modello di Erlang (o Prolog).Perché la corrispondenza di OCaml è più debole di quella di Erlang?
Le mie domande sono:
- perché è modello di OCaml la corrispondenza più debole?
- ci sono dei vantaggi nello stile di corrispondenza dei pattern di OCaml?
Un esempio concreto:
la seguente funzione (. Tratto da RWO p 63) destutters un elenco
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 sarebbe possibile (e ritengo preferito) da usare modello corrispondenti al posto del condizionale:
destutter([]) -> [];
destutter([X]) -> [X];
destutter([H,H|T]) -> destutter([H|T]);
destutter([H|T]) -> [H | destutter(T)].
Cercando questo genere di cose in OCaml ...
012.let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd :: tl -> destutter tl (* error *)
| hd :: tl -> hd :: destutter tl
;;
... genera un errore sulla linea segnata:
Error: Variable hd is bound several times in this matching
Quindi, Erlang pattern matching/stile Prolog non funziona in OCaml. Perché? Quali sono i vantaggi dell'approccio OCaml?
Con Grazie e auguri
Ivan
Domanda molto interessante, ho sicuramente bisogno di saperne di più su Erlang! –