Do đặt mặc định.Num
là một loại lớp 'mặc định', có nghĩa là nếu bạn để nó không bị ràng buộc, trình biên dịch sẽ thực hiện một vài dự đoán thông minh như loại bạn định sử dụng nó như là. Thử đặt định nghĩa đó trong mô-đun, sau đó chạy
:t f
trong ghci
; nó sẽ cho bạn biết (IIRC) f :: Integer -> Integer -> Integer
. Trình biên dịch không biết a
nào bạn muốn sử dụng, vì vậy, nó đoán được Integer
; và kể từ đó đã làm việc, nó đã đi với đoán đó.
Tại sao nó không suy ra một loại đa hình cho f
? Bởi vì hạn chế monomorphism sợ hãi [1]. Khi trình biên dịch thấy
f = (+)
nó nghĩ 'f
là giá trị', có nghĩa là nó cần một loại đơn (monomorphic). Eta-mở rộng định nghĩa để
f x = (+) x
và bạn sẽ nhận được các loại đa hình
f :: Num a => a -> a -> a
và tương tự nếu bạn eta-mở rộng định nghĩa đầu tiên bạn
f x = succ x
bạn không cần phải có gõ chữ ký nữa.
[1] Tên thực tế từ tài liệu GHC!
Nguồn
2015-02-11 15:14:12
Khi nào việc giảm này xảy ra chính xác? 'f = (+)' trong ghci không bị giới hạn. – Bergi
@Bergi - câu trả lời ở đây: http://stackoverflow.com/questions/28336108/why-is-22-0-double-in-a-hs-file-but-fractional-aa-in-ghci/28336620 # 28336620 –