2010-05-18 38 views
18

Hãy xem xét ví dụ sau:Haskell: mặc định ràng buộc để gõ

applyKTimes :: Integral i => i -> (a -> a) -> a -> a 
applyKTimes 0 _ x = x 
applyKTimes k f x = applyKTimes (k-1) f (f x) 

applyThrice :: (a -> a) -> a -> a 
applyThrice = applyKTimes 3 

Các 3 trong applyThrice được mặc định bởi GHC một Integer như khi biên dịch với -Wall:

Warning: Defaulting the following constraint(s) to type 'Integer' 
     'Integral t' 
      arising from a use of 'applyKTimes' 

Vì vậy, tôi đoán rằng Integer là mặc định Integral a => a.

  • Có cách nào để xác định "loại mặc định" cho các ràng buộc khác không?
  • Có sử dụng các loại mặc định không? (Nó không phàn nàn khi sử dụng -Wall ..)

Trả lời

14

Vâng, you can, mặc dù nó không hoàn toàn đơn giản như vậy là thêm một mặc định mỗi typeclass, và nó chỉ hoạt động cho Num và lớp con của nó trong Prelude và tiêu chuẩn thư viện. Cú pháp là default (t1, ..., tn) và chỉ có thể sử dụng một tuyên bố như vậy cho mỗi mô-đun.

Thêm default (Int), ví dụ: sẽ thay đổi mặc định cho Integral trong mã của bạn thành Int.

Mặc định mặc định là (Integer, Double) không chỉ là chính sách của GHC: đó là từ Haskell 98 Report. (GHCi hiện có extended default rules.)

Đây là a discussion của một số sự cố với hệ thống hiện tại.

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