2009-07-20 44 views
95

Tôi đã đi qua một đoạn mã Haskell trông như thế này:Biểu tượng "@" có ý nghĩa gì khi tham chiếu đến các danh sách trong Haskell?

[email protected](p:pt) 

không biểu tượng @ có ý nghĩa gì trong bối cảnh này? Tôi dường như không tìm thấy bất kỳ thông tin nào trên Google (thật không may khi tìm kiếm các biểu tượng trên Google) và tôi không thể tìm thấy hàm trong tài liệu Prelude, vì vậy tôi tưởng tượng nó phải là một loại đường cú pháp thay thế.

+12

Đừng cố gắng tìm kiếm biểu tượng cụ thể đó. Tìm kiếm cú pháp Haskell nói chung, và sau đó tìm biểu tượng trong cuộc thảo luận tổng thể đó. Ví dụ: kết quả Google hàng đầu cho "cú pháp Haskell": http://www.cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html. Sự xuất hiện thứ hai của '@' trên trang đó giải thích nó. –

+1

Điều tốt tôi đã đề cập chính xác cách tôi tìm thấy URL đó, @Iter. Bất kỳ ai cũng có thể lặp lại quy trình ngay hôm nay và tìm câu trả lời trên bất kỳ trang nào họ tìm thấy. –

Trả lời

138

Vâng, đó chỉ là cú pháp, với @ đọc to là "dưới dạng". [email protected](p:pt) cung cấp cho bạn tên cho

  1. danh sách: ps
  2. đầu của danh sách: p
  3. đuôi của danh sách: pt

Nếu không có sự @, bạn sẽ phải lựa chọn giữa (1) hoặc (2): (3).

Cú pháp này thực sự hoạt động đối với bất kỳ hàm tạo nào; nếu bạn có data Tree a = Tree a [Tree a], thì [email protected](Tree _ kids) cho phép bạn truy cập vào cả cây và con của nó.

+0

bạn có biết tên cho cú pháp này không? – danza

36

Biểu tượng @ được sử dụng để vừa đặt tên cho tham số vừa khớp với thông số đó theo mẫu @. Nó không dành riêng cho các danh sách và cũng có thể được sử dụng với các cấu trúc dữ liệu khác.

Điều này rất hữu ích nếu bạn muốn "phân tách" một tham số thành các phần của nó trong khi vẫn cần tham số như toàn bộ một nơi nào đó trong hàm của bạn. Một ví dụ nơi đây là trường hợp là tails chức năng từ các thư viện chuẩn:

tails     :: [a] -> [[a]] 
tails []    = [[]] 
tails [email protected](_:xs)  = xxs : tails xs 
7

Để thêm vào những gì người khác đã nói, chúng được gọi là như-mẫu (trong ML cú pháp sử dụng từ khóa " là "), và được mô tả trong phần Báo cáo Haskell trên patterns.

11

tôi muốn thêm rằng @ công trình ở tất cả các cấp, có nghĩa là bạn có thể làm điều này:

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d) 

Mà sau đó sẽ sản xuất này: ((Just 1, Just 2), Just 1, 1, 2)

Vì vậy, về cơ bản đó là một cách để bạn có thể gắn một mô hình cho một giá trị. Điều này cũng có nghĩa là nó hoạt động với bất kỳ kiểu mẫu nào, không chỉ danh sách, như được minh họa ở trên. Đây là một điều rất hữu ích để biết, vì nó có nghĩa là bạn có thể sử dụng nó trong nhiều trường hợp hơn.

Trong trường hợp này, a là toàn bộ Maybe Tuple, b chỉ là Just đầu tiên trong tuple, và cd là những giá trị chứa trong Just đầu tiên và thứ hai trong tuple tương ứng

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