Làm thế nào để các lớp loại phù hợp trong mô hình này?
Câu trả lời ngắn gọn là: họ không.
Bất cứ khi nào bạn giới thiệu các sự ép buộc, các lớp loại hoặc các cơ chế khác cho tính đa hình ad-hoc vào một ngôn ngữ, vấn đề thiết kế chính mà bạn gặp phải là sự gắn kết .
Về cơ bản, bạn cần đảm bảo rằng độ phân giải kiểu chữ là xác định, để một chương trình được gõ tốt có một cách hiểu duy nhất. Ví dụ: nếu bạn có thể đưa ra nhiều phiên bản cho cùng một loại trong cùng một phạm vi, bạn có khả năng có thể viết các chương trình mơ hồ như thế này:
class Blah a where
blah : a -> String
instance Blah T where
blah _ = "Hello"
instance Blah T where
blah _ = "Goodbye"
v :: T = ...
main :: IO ()
main = print (blah v) -- does this print "Hello" or "Goodbye"?
Tùy thuộc vào sự lựa chọn của trình biên dịch, trình biên dịch blah v
có thể bằng "Hello"
hoặc "Goodbye"
. Do đó, ý nghĩa của một chương trình sẽ không hoàn toàn được xác định bởi cú pháp của chương trình, mà có thể bị ảnh hưởng bởi các lựa chọn tùy ý mà trình biên dịch đưa ra.
Giải pháp của Haskell cho vấn đề này là yêu cầu mỗi loại có nhiều nhất một thể hiện cho mỗi kiểu chữ. Để đảm bảo điều này, nó chỉ cho phép khai báo cá thể ở cấp cao nhất và hơn nữa làm cho tất cả các khai báo có thể nhìn thấy trên toàn cầu. Theo cách đó, trình biên dịch luôn có thể báo hiệu lỗi nếu khai báo thể hiện mơ hồ được thực hiện.
Tuy nhiên, làm cho các tuyên bố có thể nhìn thấy trên toàn cầu phá vỡ tính cấu thành của ngữ nghĩa. Những gì bạn có thể làm để phục hồi là đưa ra một ngữ nghĩa chi tiết cho ngôn ngữ lập trình - nghĩa là bạn có thể chỉ ra cách dịch các chương trình Haskell sang một ngôn ngữ có tính kết hợp tốt hơn, có tính kết hợp tốt hơn.
Điều này thực sự mang đến cho bạn một cách để biên dịch các kiểu chữ, cũng thường được gọi là "dịch thuật bằng chứng" hoặc "chuyển đổi từ điển" trong vòng tròn Haskell và là một trong những giai đoạn đầu của hầu hết các trình biên dịch Haskell.
Máy đánh chữ cũng là một ví dụ tốt về cách thiết kế ngôn ngữ lập trình khác với lý thuyết loại thuần túy. Máy đánh chữ là một tính năng ngôn ngữ thực sự tuyệt vời, nhưng chúng khá sai theo quan điểm lý thuyết. (Đây là lý do tại sao Agda hoàn toàn không có máy đánh chữ và tại sao Coq biến chúng thành một phần của cơ sở hạ tầng suy luận heuristic.)