Ngẫu nhiên so với phân nhóm rõ ràng


18

Đây trang khẳng định rằng

nhiều ngôn ngữ không sử dụng phân nhóm ngầm (tương đương cấu trúc), thích phân nhóm rõ ràng / khai báo (tương đương khai báo)

Tôi hầu như đã sử dụng các ngôn ngữ lập trình sử dụng phân nhóm rõ ràng . Những lợi thế của phân nhóm ngầm, như được mô tả trong các ghi chú ở trên.


1
Từ FAQ, về phạm vi của cuộc trao đổi này: "Làm việc trong lĩnh vực này thường được phân biệt bởi sự nhấn mạnh của nó về kỹ thuật toán học và sự nghiêm ngặt." Tôi đang từ chối vì tôi không thấy bất kỳ phạm vi nào cho sự nghiêm ngặt trong câu trả lời cho câu hỏi này.
David Eppstein

6
Đáng buồn thay, có rất nhiều phạm vi cho sự nghiêm ngặt trong việc trả lời câu hỏi này hơn bạn có thể hy vọng ban đầu. Rất nhiều người rất nổi tiếng đã đốt cháy rất nhiều cuộc đấu vật của thập niên 90 với những câu hỏi rõ ràng tầm thường về việc phân nhóm. Thật không may, đó là một khu vực có tỷ lệ nỗ lực khen thưởng rất kém.
Neel Krishnaswami

6
vâng, có rất nhiều chỗ cho toán học và sự nghiêm ngặt trong việc trả lời câu hỏi này, hoặc ít nhất là để giải thích một cách toán học về phân loại ngầm là gì . Tôi không chắc chắn về tỷ lệ nỗ lực-phần thưởng.
Noam Zeilberger

1
Tôi có lẽ chỉ nên nói rằng nó "rất khó", vì khi suy nghĩ tôi nhận ra tôi rất quan tâm đến câu trả lời.
Neel Krishnaswami

1
Ok, tôi đã bị thuyết phục. Tôi sẽ xóa downvote của tôi nhưng hệ thống sẽ không cho phép tôi.
David Eppstein

Câu trả lời:


19

Câu trả lời ngắn gọn là "để xác minh các thuộc tính bổ sung của mã hiện có". Câu trả lời dài hơn sau.

Tôi không chắc chắn "ngầm" so với "tường minh" là thuật ngữ tốt. Sự khác biệt này đôi khi được gọi là phân nhóm "cấu trúc" và "danh nghĩa". Sau đó, cũng có một sự phân biệt thứ hai trong các giải thích có thể về phân nhóm cấu trúc (mô tả ngắn gọn). Lưu ý rằng cả ba cách hiểu về phân nhóm thực sự là trực giao và do đó, thật không có ý nghĩa gì khi so sánh chúng với nhau, thay vì hiểu cách sử dụng của nhau.

Sự khác biệt chính trong hoạt động trong việc diễn giải mối quan hệ phân nhóm cấu trúc A <: B là liệu nó có được chứng kiến ​​bởi một sự ép buộc thực sự với nội dung tính toán (thời gian chạy / tính toán) hay liệu nó có thể được chứng kiến ​​bởi sự ép buộc nhận dạng hay không. Nếu trước đây, thuộc tính lý thuyết quan trọng phải giữ là "sự gắn kết", nghĩa là, nếu có nhiều cách để chỉ ra rằng A là một kiểu con cấu trúc con của B, thì mỗi cưỡng chế đi kèm phải có cùng một nội dung tính toán.

Liên kết mà bạn đưa ra dường như có cách hiểu thứ hai về phân nhóm cấu trúc, trong đó A <: B có thể được chứng kiến ​​bằng sự ép buộc danh tính. Điều này đôi khi được gọi là "giải thích tập hợp con" của phân nhóm, theo quan điểm ngây thơ rằng một loại đại diện cho một tập hợp các giá trị, và vì vậy A <: B chỉ trong trường hợp mọi giá trị của loại A cũng là một giá trị của loại B. Nó cũng là đôi khi được gọi là "gõ tinh chỉnh" và một loại giấy tốt để đọc cho động lực ban đầu là các loại sàng lọc của Freeman & Pfenning cho ML . Để có một hóa thân gần đây hơn trong F #, bạn có thể đọc các loại của Bengston và cộng sự, các loại sàng lọc để triển khai an toàn. Ý tưởng cơ bản là lấy một ngôn ngữ lập trình hiện có có thể (hoặc có thể không) đã có các loại nhưng trong đó các loại không đảm bảo tất cả (ví dụ: chỉ an toàn bộ nhớ) và xem xét lớp thứ hai chọn các tập hợp con của chương trình với bổ sung, tính chất chính xác hơn.

(Bây giờ, tôi sẽ lập luận rằng lý thuyết toán học đằng sau cách giải thích về phân nhóm này vẫn chưa được hiểu rõ như nó cần phải có, và có lẽ đó là vì cách sử dụng của nó không được đánh giá cao như chúng nên. Một vấn đề là "bộ về các giá trị "việc giải thích các loại là quá ngây thơ, và vì vậy đôi khi nó bị bỏ qua thay vì được tinh chỉnh. Đối với một lập luận khác cho rằng cách giải thích này của phân loại đáng được chú ý hơn về mặt toán học, hãy đọc phần giới thiệu về Không gian của Paul Taylor trong Tóm tắt Đá kép .)


A×B×C<:A×BCAB

1
Công việc của trình tối ưu hóa là tìm ra bố cục bộ nhớ tối ưu, do đó, các ép buộc là danh tính thực sự phải là kết quả của tối ưu hóa.
Andrej Bauer

2
Vì vậy, chỉ để làm rõ nhận xét của Andrej liên quan đến câu trả lời của tôi, trong một diễn giải gõ tinh chỉnh, các mối quan hệ phụ luôn được chứng kiến ​​bởi sự ép buộc danh tính theo định nghĩa , bởi vì các loại sàng lọc không có thêm nội dung tính toán. Nói cách khác, nếu A và B là hai sàng lọc ("tập con" / "thuộc tính") của một loại giá trị X, A <: B khẳng định rằng với mọi giá trị x trong X, nếu x: A thì x: B. Một tuyên bố như vậy có thể được xác minh hoặc làm sai lệch, nhưng nó không có hiệu lực trong thời gian chạy, vì các bằng chứng cho thấy x: A và x: B không tồn tại trong thời gian chạy.
Noam Zeilberger

1
N{x:N|x<232}

3
N{x:N|x<232}N{x:N|x<232}
Noam Zeilberger

4

Câu trả lời này là một loại bổ sung tối thiểu cho câu trả lời tuyệt vời của Noam. Một điểm dữ liệu quan tâm là số phận của các khái niệm C ++, vốn dựa trên nỗ lực thống nhất các khái niệm cấu trúc và danh nghĩa về loại.

Có một bài viết tuyệt vời ở đây, với các liên kết đến phần lớn các cuộc thảo luận có liên quan: http://bartoszmilewski.wordpress.com/2010/06/24/c-con accept-a-postmortem /

Tuy nhiên, bài viết trên không thảo luận về vấn đề danh nghĩa và cấu trúc ở bất kỳ chiều sâu nào. Có một bài viết khác ở đây, đó là: http://nerdland.net/2009/07/alas-con accept-we-hardly -knew-ne /

Bài viết quan trọng mà cả hai hướng đến là Bjarne Stroustrup's Simpl Đơn giản hóa việc sử dụng các khái niệm, ví dụ: http://www.open-std.org/jtc1/sc22/wg21/docs/ con / 2009 / n2906.pdf , đi vào thực tế các vấn đề gặp phải ở một số độ sâu.

Nhìn chung, các cuộc thảo luận là thực tế hơn nghiêm ngặt. Tuy nhiên, nó cung cấp một cái nhìn sâu sắc tốt về các loại đánh đổi liên quan đến các vấn đề này, đặc biệt là trong bối cảnh của một ngôn ngữ lớn hiện có.

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.