Tôi mới tham gia OCaml và đọc cuốn sách Real World OCaml (RWO). Kết hợp mẫu được mô tả trong chương 3 và có vẻ yếu so với mô hình của Erlang (hoặc Prolog).Tại sao mẫu của OCaml lại yếu hơn so với Erlang?
Câu hỏi của tôi là:
- tại sao mô hình OCaml của phù hợp với yếu?
- có lợi thế nào đối với kiểu kết hợp mẫu của OCaml không?
Một ví dụ cụ thể:
Chức năng sau (. Lấy từ RWO p 63) destutters một danh sách
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]
Trong Erlang nó sẽ có thể (và tôi nghĩ ưa thích) để sử dụng mô hình khớp với thay vì có điều kiện:
destutter([]) -> [];
destutter([X]) -> [X];
destutter([H,H|T]) -> destutter([H|T]);
destutter([H|T]) -> [H | destutter(T)].
Đang thử loại điều này trong OCaml ...
let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd :: tl -> destutter tl (* error *)
| hd :: tl -> hd :: destutter tl
;;
... đặt ra một lỗi trên dòng đánh dấu:
Error: Variable hd is bound several times in this matching
Vì vậy, Erlang/Prolog kiểu mẫu phù hợp với không hoạt động trong OCaml. Tại sao? Ưu điểm của phương pháp OCaml là gì?
Với cảm ơn và lời chúc tốt nhất
Ivan
Câu hỏi rất thú vị, tôi chắc chắn cần tìm hiểu thêm về Erlang! –