2014-05-20 22 views
5

Chỉ cần nhìn chằm chằm với Haskell. Tôi muốn xác định một số yếu tố để dễ dàng tạo ra hình thái giữa chúng.Giá trị của các biến cho kết hợp mẫu

a = "foo" 
b = "bar" 

g a = a --Problem is here 
g b = a --Problem is here 

Sửa Vấn đề là xử lý Haskell "a" trong "g một" như là một biến, nhưng tôi thực sự muốn giá trị của "a" được định nghĩa ở trên. Về mặt lý thuyết một muốn điều này

g (valueOf a) = a --Problem is here 
g (valueOf b) = a --Problem is here 

đâu valueOf là một chức năng kỳ diệu mà sẽ cho tôi

g "foo" = a 
g "bar" = a 
+0

g không có id vì: g b = a –

Trả lời

7

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 34. Đâ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.

+0

Cảm ơn! Tôi thấy vấn đề. Nhưng vẫn nghĩ rằng nên có một nhà điều hành để nói cho người thông dịch sử dụng định nghĩa trong phạm vi bên ngoài. –

+0

Các nhân viên bảo vệ như 'x | x == a = ... | x == b = ...'không yêu cầu gõ nhiều. Nếu không, bạn có thể muốn thử nghiệm với [dạng xem] (http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#view-patterns), nhưng chúng dường như quá mức cần thiết cho điều này nhiệm vụ IMHO. – chi

3

Xin lỗi trước nếu đây là một sự hiểu lầm hoàn toàn về những gì bạn muốn thực hiện nhưng sẽ không phải một cái gì đó như thế này làm gì?

Data Obj = A | B 

g A = A 
g B = A 

f A = "foo" 
f B = "bar" 

Bạn muốn có một bộ đối tượng được xác định trước, phải không?

Các vấn đề liên quan