2013-07-17 23 views
5

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?

+1

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

+3

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

+2

@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). –

Trả lời

7

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.

9

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.

3

container đa hình như danh sách, Sequence, MaybeMap là trường hợp của Functor, FoldableTraversable 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.

+0

[Đặ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

+0

Đúng, điểm tốt. – phadej

+1

Tìm hiểu thêm về Set and Functor: http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

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