2013-07-24 34 views
6

Haskell's type-defaulting rules mặc một kiểu biến một với các ràng buộc (C1 một, ..., Cn a) nếu:quy tắc kiểu mặc định tổng quát

  • Loại biến một xuất hiện trong không ràng buộc khác
  • Tất cả các lớp Ci là tiêu chuẩn.
  • Ít nhất một trong các lớp Ci là số

Điều này làm cho ý nghĩa với tôi nhưng nó cũng rất hạn chế: trong thực tế nó có nghĩa là bạn luôn luôn phải xác định loại khi nó là mơ hồ khi bạn làm việc với các lớp tùy chỉnh. Ví dụ, điều này không biên dịch:

class (Show a) => MyShow a where 
    myShow :: a -> String 
    myShow = show 

instance (MyShow a) => MyShow (Maybe a) where 
    myShow Nothing = "Nothing" 
    myShow (Just x) = "Just " ++ (myShow x) 

main = print $ myShow Nothing -- ambiguous 

GHCi mở rộng này tập hợp các quy tắc theo cách này:

  • Tất cả các lớp học Ci các lớp học kiểu đơn tham số.
  • Ít nhất một trong các lớp Ci là số, hoặc là Hiện, Eq, hoặc Ord.

và GHC có phần mở rộng được gọi là ExtendedDefaultRules bật các quy tắc này. Tuy nhiên, phần mở rộng này rất cụ thể: nó chỉ hoạt động trên GHC và với các lớp tiêu chuẩn. Ví dụ, người ta có thể nghĩ về các thư viện không sử dụng thư viện chuẩn. Trong trường hợp đó, phần mở rộng GHCi sẽ không hoạt động.

Câu hỏi của tôi là: cách duy nhất để mở rộng các quy tắc mặc định kiểu Haskell như GHCi thực hiện với phần mở rộng của trình biên dịch là gì? Và nhiều hơn nữa chung chung: là có một cách để xác định loại mặc định dựa trên một số quy tắc về những hạn chế trong Haskell 98?

+3

Không có cách nào để làm những gì bạn muốn. Nếu bạn có thể nghĩ ra một thiết kế tốt, chúng ta đều là đôi tai. Kiểu mặc định hiện tại là một mụn cóc. – augustss

+1

Một cái gì đó như: 'instance (MyShow a) => MyShow (Có thể a) trong đó .... mặc định (Int)' . Trình biên dịch có thể kiểm tra xem loại có mơ hồ hay không và trong trường hợp đó là mặc định. Trong trường hợp trên Không có gì sẽ có loại Có thể Int. Tất nhiên bạn có thể mặc định chỉ trên các loại đáp ứng các ràng buộc. – mariop

+1

@mariop Tôi hiểu rằng bạn rất hào hứng với ý tưởng này, nhưng tại thời điểm này có vẻ như một chút đã được nướng một nửa. Có rất nhiều điều để suy nghĩ về, như: Bạn nên làm gì nếu có nhiều ràng buộc mà tất cả đều có mặc định khác nhau? Người dùng thư viện có thể ảnh hưởng như thế nào đến các lựa chọn mặc định của thư viện để phù hợp hơn với nhu cầu của họ? Tại sao các trường hợp là đúng nơi chuẩn để đính kèm các hướng dẫn mặc định? Giải pháp của bạn có thể được khái quát hóa thành các lớp loại đa tham số (và các loại quỹ đạo, và các loại gia đình)? Tôi chắc chắn có rất nhiều câu hỏi khó khác mà một đề xuất hoàn chỉnh cũng cần phải giải quyết. –

Trả lời

6

Không có cách nào để làm những gì bạn muốn.

Tình hình hiện tại bị nghèo nàn bởi thiết kế. Ý tưởng là để làm điều gì đó tối thiểu có thể được mở rộng trong tương lai khi chúng ta có một thiết kế tốt.

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