2016-08-03 27 views
6

Theo như tôi đã cam kết, toán tử hyper » là phím tắt cho map(). Tại sao sau đây trả lại hai kết quả khác nhau và trong ví dụ thứ hai .sum dường như không được áp dụng?Toán tử Perl6 hyper »không hoạt động như bản đồ

say ([1,2], [2, 2], [3, 3]).map({.sum}); 
# (3 4 6) 
say ([1,2], [2, 2], [3, 3])».sum; 
# ([1 2] [2 2] [3 3]) 

Trả lời

6

Hyperops hạ xuống đệ quy vào danh sách phụ. Ngoài ra họ là những ứng cử viên cho autothreading (NYI) có nghĩa là hoạt động của họ là ra khỏi trật tự.

Cũng có lỗi được sửa với https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb.

say ([1,2], [2, 2], [3, 3])».sum; 
# (3 4 6) 
+2

tất cả những gì là đúng, nhưng lưu ý rằng hyperoperators không nhất thiết phải đi sâu vào substructures (cf 'nói ([1,2], [2, 2], [3, 3])». Elems'); được cho là, 'List.sum' chỉ thiếu một chú thích' là nodal' ... – Christoph

5

TL; DR Bạn đã gần như chắc chắn gặp phải một lỗi. Điều đó nói rằng, map và siêu kết nối » có những khác biệt lớn.

map trả về số Seq. Seq này mang lại kết quả của việc áp dụng người dùng cung cấp mã để mỗi người trong số các yếu tố của một người dùng cung cấp cấu trúc dữ liệu:

  • một mức độ sâu (traversal của cấu trúc dữ liệu là nông - map không đệ quy xuống để phụ cấu trúc của cấp cao nhất của cấu trúc dữ liệu)
  • mỗi lần một (mọi thứ được thực hiện tuần tự, không có gì song song)
  • lazily (map trả về ngay lập tức; mã người dùng được cung cấp được áp dụng cho kết quả sau này khi cần thiết để kéo các giá trị từ Seq)

Các » hyperop trả về toán hạng cấu trúc dữ liệu trên nó để lại sau khi đã áp dụng các hoạt động unary về quyền của mình để các yếu tố của cấu trúc dữ liệu:

  • chỉ có một mức độ sâu hoặc giảm dần để leavesnhư được quyết định bởi hoạt động đơn nhất
  • theo lô song song, ít nhất ngữ nghĩa (trách nhiệm của nhà lập trình là chọn một hoạt động đơn nhất sẽ mang lại kết quả chính xác khi áp dụng cho nhiều phần tử trong đoạn llel theo thứ tự tùy ý)
  • háo hức (không giống như một cuộc gọi map, một hyperoperation chỉ trả lại khi các nhà điều hành unary đã được áp dụng cho toàn bộ cấu trúc dữ liệu)

Nếu bạn đang áp dụng một nhà điều hành unary đó là "nodal" (do đó quá trình tăng tốc sẽ chọn không hạ xuống) hoặc cấu trúc dữ liệu đang hoạt động chỉ sâu một cấp (do đó không có lá cấp thấp hơn để tăng tốc đi xuống) thì sự khác biệt giữa tăng tốc và map với một toán tử đơn nhất chỉ là các khía cạnh tuần tự/song song và lười biếng/háo hức.

Có vẻ như khá rõ ràng đối với tôi rằng sum phải là một toán tử nút nếu không nó sẽ đi vào các cấu trúc phụ cho đến khi nó đến từng lá và do đó sẽ được áp dụng cho một loạt các giá trị đơn lẻ. ETA: Có vẻ như nó đã được sửa.

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