Điều bạn đang cố gắng thực hiện được gọi là mẫu bình đẳng và không được cung cấp bởi Mục tiêu Caml. Các mẫu Caml của khách quan là cấu trúc tĩnh và thuần túy. Tức là, một giá trị phù hợp với mẫu có phụ thuộc hoàn toàn vào cấu trúc của giá trị hay không và theo cách được xác định tại thời gian biên dịch. Ví dụ: (_, _)::tail
là mẫu phù hợp với bất kỳ danh sách không trống nào có đầu là một cặp. (identifier, value)::tail
khớp chính xác với cùng một giá trị; khác biệt duy nhất là sau này liên kết hai tên khác là identifier
và value
.
Mặc dù một số ngôn ngữ có hình thức bình đẳng, có những cân nhắc thực tế không tầm thường làm cho chúng trở nên rắc rối. Bình đẳng nào? Tính bình đẳng vật lý (==
trong Ocaml), bình đẳng về cấu trúc (=
trong Ocaml), hoặc một số phương trình tùy chỉnh phụ thuộc vào loại? Hơn nữa, trong Ocaml, có một chỉ dẫn cú pháp rõ ràng về tên nào là các chất kết dính và tên nào được tham chiếu đến các giá trị bị ràng buộc trước đây: bất kỳ số nhận dạng chữ thường nào trong một mẫu là một chất kết dính. Hai lý do này giải thích lý do tại sao Ocaml không có các mô hình bình đẳng được nung vào. Cách thành ngữ để thể hiện một mô hình bình đẳng trong Ocaml là cảnh giác. Bằng cách đó, nó ngay lập tức rõ ràng rằng kết hợp không phải là cấu trúc, rằng identifier
không bị ràng buộc bởi mô hình này phù hợp, và bình đẳng đang được sử dụng. Đối với xấu xí, đó là trong mắt của khán giả - như một lập trình viên Ocaml thói quen, tôi tìm thấy các mô hình bình đẳng xấu xí (vì những lý do trên).
match bindings with
| (id, value)::tail when id = identifier -> value
| (_, _)::tail -> getValue identifier tail
| [] -> -1
Trong F #, bạn có một khả năng: active patterns, cho phép bạn xác định trước lính gác mà liên quan đến một trang web duy nhất trong một mẫu.
Cách tiếp cận ban đầu của bạn nhắc tôi về sự thống nhất của Prolog, nó khá tuyên bố hơn là chức năng. – ron