Tôi phát hiện ra rằng một số thùng chứa có một bộ chức năng rất giống nhau. Ví dụ: List, Set, Sequence, Text và Bytestrings. Tôi tự hỏi tại sao họ không sử dụng một hoặc nhiều typeclasses phổ biến.Tại sao không có typeclass cho các loại container?
Trả lời
Thực ra có, xem câu hỏi Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations), gần như là bản sao của bạn.
Lý do chính để tham gia vào gói riêng biệt có thể là cần có phần mở rộng ngôn ngữ - phụ thuộc chức năng hoặc loại gia đình. Chúng tôi phải bằng cách nào đó nói rằng Text
chỉ có thể chứa Char
s, ByteString
chỉ có thể chứa Word8
s, []
có thể chứa bất kỳ loại nào và Set
chỉ có thể chứa các trường hợp Ord
.
Bộ chức năng phổ biến nào? AFAICS, chỉ có khả năng kết hợp nhiều thùng chứa thành một thùng chứa duy nhất và để tạo các vùng chứa trống. Và đây, tất cả chúng đều là Monoid
, cung cấp chính xác giao diện đó!
Bạn không thể thực sự làm bất cứ điều gì khác với tất cả những điều này vì một số là đa hình, một số đơn hình.
container đa hình như danh sách, Sequence, Maybe và Map là trường hợp của Functor, Foldable và Traversable typeclasses.
Đối Set bạn chỉ có Foldable, như Ord dụ làm cho nó không thể xác định những người khác (bạn có thể xác định fmap
(Data.Set.map) mà sẽ tuân theo luật functor, nhưng đó là chữ ký sẽ yêu cầu trường Ord trên lập luận).
Như đã đề cập trước đây, Văn bản và Ký hiệu có thể là trường hợp của các kiểu chữ tương tự được xác định, nhưng bạn sẽ cần hoặc là phụ thuộc chức năng hoặc kiểu gia đình.
[Đặt _is_ monoid] (http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231): vì lớp đó có không có chức năng đa hình/loại chứa được cố định trong đầu thể hiện, nó hoạt động như một thùng chứa đơn hình ở đó. - Ngẫu nhiên, thậm chí có một cách thông minh mà bạn có thể [làm cho nó Functor/Applicative/Monad] (http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html), là tốt; yêu cầu ràng buộc cá thể 'Ord' trong GADT. – leftaroundabout
Đúng, điểm tốt. – phadej
Tìm hiểu thêm về Set and Functor: http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej
- 1. VC++ cho phép sử dụng các loại const cho các container STL. Tại sao?
- 2. Tại sao MEF-container không có sẵn trong mô-đun?
- 3. Tại sao không có loại nguyên thủy cho Chuỗi?
- 4. Tại sao các vùng chứa C++ không cho phép các loại không đầy đủ?
- 5. Deconstruction loại trong định nghĩa typeclass (Haskell)
- 6. Tại sao div "container" của tôi không chứa các phần tử lưu hành của tôi?
- 7. Danh sách các mặt hàng của các loại bị hạn chế bởi typeclass
- 8. Tại sao không có loại dấu phẩy động không dấu?
- 9. Tại sao Định vị Tuyệt đối Trong Container Yêu cầu Container phải tương đối
- 10. Tại sao tôi không thể có int trong loại ArrayList?
- 11. Tại sao không có loại hàm một phần nào?
- 12. Tại sao các loại giá trị không thể là rỗng
- 13. Haskell: CóKhông có loại lớp. Tại sao lại là Integer?
- 14. Tại sao không có NSArrayController cho iPhone?
- 15. Tại sao lại có 2 loại AppFabric?
- 16. Kiểm tra Typeclass Haskell
- 17. Tại sao không có loại Integer chưa được kích hoạt?
- 18. E2010 Các loại không tương thích, tại sao?
- 19. Tại sao C# không cho phép các loại sử dụng bố cục để có chuyển đổi ngầm cho giao diện?
- 20. Bạn có thể đăng ký một thể hiện hiện tại của một loại trong Windsor Container?
- 21. Haskell Typeclass shorthand
- 22. Template typedef cho container std (không có chuyên môn)?
- 23. Tại sao C# (4.0) không cho phép đồng và contravariance trong các loại lớp chung?
- 24. Tại sao không thể nhập các thông số loại không thuộc loại lớp
- 25. Tại sao hàm tạo mặc định không xuất hiện cho các loại giá trị?
- 26. Tại sao C# không suy ra các loại chung của tôi?
- 27. Tại sao loại chung loại này không được chuyển đổi?
- 28. Tại sao loại HttpConfiguration của tôi không có loại ServiceResolver sử dụng .Net MVC 4 với WebApi?
- 29. Tại sao các loại Java.util.concurrent.TimeUnit không lớn hơn SECONDS có sẵn trong Android?
- 30. Làm cách nào để tạo các trường hợp typeclass của một loại được quảng cáo?
Thực ra họ làm. Nhưng danh sách "typeclasses phổ biến" thường được giới hạn trong 'Monoid',' Functor' và đôi khi, 'ListLike'. Tôi nghĩ rằng đó là bởi vì các lớp khác không tồn tại hoặc không đủ phổ biến. – Yuras
Nhân tiện, hãy xem gói 'thấu kính' cho một thư viện đã tìm ra cách trừu tượng hóa tất cả những thứ đó. Nhưng nó không làm điều đó với kiểu chữ mới, theo cách bạn nghĩ .. – Carl
@Yuras - thùng chứa nên hỗ trợ Traversable và có thể gập lại (hoặc có lý do chính đáng để không làm). –