2014-11-05 15 views
8

Trong các câu trả lời cho các hướng dẫn cho OCaml sẵn tại this site, một số các giải pháp, trong đó có một để loại bỏ bản sao liên tiếp của các yếu tố danh sách, được viết như vậy:"là" từ khóa trong OCaml

let rec compress = function 
    | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t 
    | smaller -> smaller;; 

gì mức độ liên quan của dòng a :: (b:: _ as t) là gì? Tại sao tôi không thể viết nó như là a :: b :: t thay thế?

Trả lời

9

t trong b :: _ as t bị ràng buộc với b :: _. Vì vậy, ý nghĩa là khác nhau. Nếu bạn sử dụng mẫu a :: b :: t, bạn sẽ cần phải nói compress (b :: t), đó là một chút ít thanh lịch và một chút ít hiệu quả.

5

Từ khóa as liên kết tên cho tất cả hoặc một phần của mẫu. Khi bị ràng buộc, tên có thể được sử dụng thay cho mẫu mà nó đại diện. Trong chức năng "nén" của bạn, t được liên kết với mẫu b :: _. Khi t bị ràng buộc, nó có thể được sử dụng trong các biểu thức tiếp theo, như trong phần còn lại của hàm "nén".

as ràng buộc tên xảy ra từ trái sang phải, không giống như hầu hết các ngôn ngữ (ngoại trừ kiểu chữ C). Ngoài ra, :: dường như có mức độ ưu tiên cao hơn as.

Do đó, (b :: _ as t) tương đương với ((b :: _) as t). Điều này có thể gây nhầm lẫn cho những người sử dụng các ràng buộc từ phải sang trái. Lưu ý rằng a :: (b :: _) as t sẽ ràng buộc toàn bộ mẫu a :: b :: _ đến t, do ưu tiên được đề cập ở trên.

tham khảo: