2012-01-18 40 views
28

Tôi chỉ cần chạy qua cú pháp sau đây trong một đoạn mã Haskell -Cú pháp haskell này là gì?

data A = A Int Int | B 

m :: A -> Int 
m a = case a of 
    A{} -> 1 
    _ -> 2 

các A{} làm gì ở đây là gì? Liệu số {} có tự động khớp với bất kỳ số đối số nào không?

Tôi có cảm giác rằng điều này đang khai thác thực tế là cú pháp bản ghi Haskell desugars đến một loạt các hàm và một kiểu dữ liệu đại số thông thường. Đó là trường hợp?

+5

Tìm hiểu điều gì đó mới mẻ mỗi ngày và tôi đã lập trình Haskell được 5 năm; không bao giờ nhìn thấy cú pháp trong cuộc đời tôi. –

Trả lời

28

Có, A{} khớp với bất kỳ giá trị nào được tạo bằng công cụ xây dựng A, bất kể loại đã được khai báo có cú pháp ghi hay không.

Các language report định

Khái niệm F {}, trong đó F là một nhà xây dựng dữ liệu, là hợp pháp hay không F được khai báo với cú pháp kỷ lục (với điều kiện F không có lĩnh vực nghiêm ngặt - xem viên đạn thứ tư trên); nó biểu thị F ⊥1… ⊥n, trong đó n là số nguyên của F.

'bullet thứ tư' được đề cập trong ngoặc đơn nói rằng đó là lỗi tĩnh để xây dựng giá trị với cú pháp ghi cánh đồng.

Và trong phần trên pattern matching, một trong những quy tắc ngữ pháp cho mô hình là

apat -> qcon { fpat1 , … , fpatk }  (labeled pattern, k ≥ 0) 

và ngữ nghĩa được đưa ra trong tiểu mục trên ngữ nghĩa chính thức của mô hình khớp (3.17.3) như

(o) case v of { K {} -> e ; _ -> e′ } 
     = case v of { 
      K _… _ -> e ; _ -> e′ } 
+3

Cú pháp này rất hữu ích, bởi vì ngay cả khi số đối số cho hàm tạo 'A' thay đổi, định nghĩa hàm không cần thay đổi. Với đối sánh mẫu thông thường (ví dụ: 'A _ _ -> ...') điều này sẽ không xảy ra. –

+0

@Daniel - nhưng trong trường hợp này chúng tôi đang nói không phải của các biểu thức, nhưng các mẫu. Tôi nghĩ rằng 'F {}' nên tương đương với 'F _1 _2 ... _n'where * n * là tính xác thực của hàm tạo. – Ingo

+0

@Ingo Right. Chỉ nhìn vào phần 'ngữ nghĩa không chính thức' tối qua, không tìm thấy gì ở đó, nhưng phần biểu hiện nổi bật. Tìm thấy nó trong phần ngữ nghĩa chính thức sau một vài giờ ngủ. –

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