2011-08-28 28 views
8

Trong chapter 4 của Erik Meijer trên nguyên tắc cơ bản lập trình chức năng, ông chủ yếu viết:tự xác định boolean kết hợp

True &&& x | x == True = True 
      | x == False = False 

Đó không phải là không cần thiết verbose? Không thể tôi chỉ cần viết:

True &&& x = x 

hoặc thậm chí:

(&&&) True = id 

(&&&) False = const False   

Bằng cách này, làm thế nào mà tôi không thể viết như sau?

(True &&&) = id 

(False &&&) = const False   

ghci phản ứng với:

Parse error in pattern: True &&& 

Trả lời

12

Vâng, theo cách bạn định nghĩa nó là tốt hơn. Từ Prelude:

True && x = x 
False && _ = False 

Bạn chỉ có thể sử dụng các phần trong biểu thức, không theo mẫu. Không có lý do sâu sắc tại sao không nên cho phép (True &&) trong mẫu. Nhưng đó là một điều hiếm hoi để muốn mà tôi không nghĩ rằng nó có giá trị phức tạp.

+0

N.B. Tôi nghĩ bạn * có thể * viết nó như là '(&&)' trong một khuôn mẫu. Vì vậy, '(&&) True = id' có thể hoạt động. –

+0

Có, nhưng (&&) không phải là một phần, nhưng hình thức tiền tố của một nhà điều hành infix, tôi nghĩ. –

+0

@Erik Hesselink có, nhưng không có sự khác biệt ngữ nghĩa giữa "toán tử tiền tố" và "phần hai mặt". Ngôn ngữ chỉ cho phép một cú pháp khi xác định toán tử và không phải cú pháp kia. – Carl

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