Bạn có thể nghĩ đến bảo vệ như đường chỉ cú pháp cho một câu lệnh if. Biểu thức trong bộ bảo vệ có thể là bất kỳ biểu thức boolean hợp lệ nào, giống như trong câu lệnh if. Điều này có nghĩa là bạn có thể sử dụng bất kỳ giá trị và hàm nào trong phạm vi.
Ví dụ, bạn có thể viết lại như sau:
foo x | abc = ...
| def = ...
| otherwise = ...
như
foo x = if abc then ... else if def then ... else ...
Chúng tôi cũng có thể viết này một chút hơn một cách chi tiết với case
hơn if
:
foo x = case abc of
True -> ...
False -> case def of
True -> ...
False -> ...
Xét cho cùng, if
chính nó chỉ là cú pháp ar cho một trường hợp! Viết tất cả mọi thứ theo điều khoản của case
làm cho nó dễ dàng hơn để xem làm thế nào các tính năng khác nhau chỉ là cú pháp đường cho cùng một điều.
Biểu thức thứ hai có ý nghĩa rõ ràng mặc dù các điều kiện tham chiếu các biến hiện tại (abc
và def
) thay vì tham số chức năng x
; các vệ sĩ chỉ làm việc theo cùng một cách.
Ví dụ của bạn phức tạp hơn một chút vì nó sử dụng phần mở rộng có tên là "pattern guards". Điều này có nghĩa rằng người bảo vệ có thể nhiều hơn chỉ là một boolean - nó cũng có thể cố gắng để phù hợp với một mô hình. Nếu mẫu khớp với nhau, người bảo vệ thành công (ví dụ như người bảo vệ với True
); nếu không, người bảo vệ sẽ không khớp (giống như nhận được False
).
Chúng ta có thể tưởng tượng viết lại nó như sau:
readPoint s | Just [x, y] <- matchRegex (mkRegex "...") s = ...
| otherwise = ...
như
readPoint s = case matchRegex (mkRegex "...") s of
Just [x, y] -> ...
_ -> ...
Bạn có thể xem song song giữa điều này và phiên bản case
của lính bình thường. Bảo vệ mô hình chỉ mở rộng các desugaring để tùy ý các mẫu thay vì chỉ booleans.
Một lần nữa, tôi chắc chắn bạn sẽ đồng ý rằng việc cho phép bất kỳ biểu thức nào trong tuyên bố case
- không có lý do gì để hạn chế việc sử dụng đối số của hàm. Điều này cũng đúng đối với các vệ sĩ bởi vì chúng thực sự chỉ là đường cú pháp.
Tuyệt vời! Nó luôn luôn tốt để nhắc nhở rằng khá nhiều tất cả mọi thứ trong Haskell chỉ là cú pháp đường cho một số trường hợp và biểu thức lambda. – leftaroundabout