Biểu tượng của @ @ có nghĩa gì trong tham chiếu đến các danh sách trong Haskell?


127

Tôi đã bắt gặp một đoạn mã Haskell trông như thế này:

ps@(p:pt)

Không những gì @biểu tượng có ý nghĩa trong bối cảnh này? Tôi dường như không thể tìm thấy bất kỳ thông tin nào trên Google (thật khó để tìm kiếm các biểu tượng trên Google) và tôi không thể tìm thấy chức năng 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ế.


14
Đừ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ả hàng đầu của Google cho "Cú pháp Haskell": cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . Sự xuất hiện thứ hai của @trang đó giải thích nó.
Rob Kennedy

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

Câu trả lời:


179

Vâng, đó chỉ là cú pháp cú pháp, với @đọc to là "như". ps@(p:pt)đặt tên cho bạn

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

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

Cú pháp này thực sự hoạt động cho bất kỳ nhà xây dựng nào; nếu bạn có data Tree a = Tree a [Tree a], sau đó t@(Tree _ kids)cung cấp cho bạn quyền truy cập vào cả cây và con của nó.


3
Bạn có biết tên cho cú pháp này?
danza

7
Nó được gọi là "theo mẫu"
adamo

41

Các @Symbol được sử dụng cho cả hai đặt tên cho một tham số và kết hợp mà tham số đối với một mô hình mà theo @. Nó không cụ thể cho 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 toàn bộ tham số ở đâu đó trong hàm của bạn. Một ví dụ trong trường hợp này là tailshàm từ thư viện chuẩn:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

21

Tôi muốn thêm @hoạt động ở 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à cách để bạn liên kết một mẫu với một giá trị. Điều này cũng có nghĩa là nó hoạt động với bất kỳ loại mẫu nào, không chỉ các danh sách, như đã trình bày ở 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, alà toàn bộ Maybe Tuple, bchỉ là lần đầu tiên Justtrong bộ dữ liệu cdlà các giá trị được chứa trong lần đầu tiên và thứ hai Justtrong bộ dữ liệu tương ứng


9

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.