2012-01-31 42 views
7

Theo cách này, hãy lùi lại một bước so với câu hỏi trước đó của tôi, nhưng ... Ai đó có thể nhắc tôi tại sao số này không hoạt động không?Các loại phần tử vùng chứa

 
class Container c e where 
    empty :: c 
    insert :: e -> c -> c 

instance Container [x] x where 
    empty = [] 
    insert = (:) 

instance Container ByteString Word8 where 
    empty = BIN.empty 
    insert = BIN.cons 

instance Ord x => Container (Set x) x where 
    empty = SET.empty 
    insert = SET.insert 

Rõ ràng nếu điều đó dễ dàng, không ai bận tâm phát minh ra các phụ thuộc chức năng cũng như các loại liên quan. Vậy vấn đề ở trên là gì?

+0

Hãy thử sử dụng nó. Bạn sẽ sớm nhận được khiếu nại về quá tải không rõ ràng. – augustss

Trả lời

10

Không có gì ngăn bạn thêm instance Container [Int] Intinstance Container [Int] Char và khi bạn yêu cầu empty :: [Int] trình biên dịch không có cách nào biết được thể hiện của nó.

"Ah, nhưng tôi chỉ có instance Container [Int] Int", bạn nói. "Và instance Container [Int] Char cũng sẽ là lỗi."

Nhưng trình biên dịch không thể biết rằng bạn sẽ không thêm instance Container [Int] Char trong tương lai và nếu bạn làm như vậy, bạn không được phép phá vỡ mã hiện tại của mình.

Vì vậy, chúng ta cần một số cách để nói với trình biên dịch rằng

  • tham số đầu tiên của Container duy nhất xác định tham số thứ hai của Container
  • nếu nó thấy trường hợp khác nhau mà chỉ khác nhau ở loại thứ hai, cho biết lỗi

Nhập phụ thuộc chức năng.

+0

Tôi biết mình phải quên điều gì đó hiển nhiên ... – MathematicalOrchid

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