Sử dụng
a = "foo"
b = "bar"
g x | x==a = a
| x==b = a
hoặc
g "foo" = a
g "bar" = a
Khi bạn mô hình kết hợp sử dụng một biến như trong
g a = ...
biến a
là một biến địa phương, liên kết với các đối số của hàm. Ngay cả khi a
đã được xác định trên toàn cầu, mã ở trên sẽ không sử dụng giá trị của toàn cầu a
để thực hiện so sánh.
Ngữ nghĩa này cho phép lý do cục bộ về mã của bạn. Hãy xem xét đoạn mã này là một ví dụ:
f 2 x = 4
f c d = 0
Chỉ bằng cách nhìn vào định nghĩa ở trên, bạn có thể thấy rằng f 2 3
là 4
. Đây không phải là thay đổi nếu sau này bạn thêm một định nghĩa cho x
như sau:
x = 5
f 2 x = 4
f c d = 0
Nếu ngữ nghĩa trận đấu so với đối số thứ hai để 5
, bây giờ chúng ta sẽ có f 2 3
bằng 0
. Điều này sẽ làm cho lý luận về các định nghĩa hàm khó hơn, vì vậy hầu hết các ngôn ngữ chức năng (nếu không phải tất cả) chẳng hạn như Haskell sử dụng các biến "cục bộ" để khớp mẫu, bỏ qua các định nghĩa toàn cầu có thể có cho các biến đó.
Một lựa chọn mạo hiểm hơn là sử dụng view patterns:
{-# LANGUAGE ViewPatterns #-}
a = "foo"
b = "bar"
g ((==a) -> True) = ...
g ((==b) -> True) = ...
Tôi không phải là một fan hâm mộ của phương pháp này tuy nhiên, kể từ khi tôi tìm thấy các mẫu tiêu chuẩn với lính gác để được rõ ràng hơn.
g không có id vì: g b = a –