Xem câu trả lời StackOverflow này liên quan đến suy luận kiểu Go. Bản thân tôi không quen với Go nhưng dựa trên câu trả lời này có vẻ như là "loại trừ" một chiều (để mượn một số hình thái học C ++). Nó có nghĩa là nếu bạn có:
x := y + z
sau đó loại x
được suy ra bằng cách tìm ra loại y + z
, đó là một điều tương đối tầm thường để làm cho trình biên dịch. Để làm điều này, các loại y
và z
cần được biết đến một tiên nghiệm : điều này có thể được thực hiện thông qua các chú thích loại hoặc suy ra từ các nghĩa đen được gán cho chúng.
Ngược lại, hầu hết các ngôn ngữ chức năng có kiểu suy luận sử dụng tất cả thông tin có thể có trong một mô-đun (hoặc hàm, nếu thuật toán suy luận là cục bộ) để rút ra loại biến. Các thuật toán suy luận phức tạp (như Hindley-Milner) thường liên quan đến một số dạng thống nhất loại (hơi giống như giải phương trình) đằng sau hậu trường. Ví dụ: trong Haskell, nếu bạn viết:
let x = y + z
sau đó Haskell có thể suy ra loại không chỉ x
mà còn y
và z
đơn giản dựa trên thực tế là bạn đang thực hiện bổ sung trên chúng. Trong trường hợp này:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(Chữ thường a
ở đây biểu thị một loại đa hình , thường được gọi là "generic" trong các ngôn ngữ khác như C ++. Phần Num a =>
này là một ràng buộc để chỉ ra rằng a
hỗ trợ loại có một số khái niệm bổ sung.)
Đây là một ví dụ thú vị hơn: bộ kết hợp điểm cố định cho phép xác định bất kỳ hàm đệ quy nào:
let fix f = f (fix f)
Lưu ý rằng không nơi nào chúng tôi đã chỉ định loại f
, chúng tôi cũng không chỉ định loại fix
, nhưng trình biên dịch Haskell có thể tự động tìm ra rằng:
f :: t -> t
fix :: (t -> t) -> t
Điều này nói rằng:
- Tham số
f
phải là một hàm từ một số loại tùy ý t
đến cùng loại t
.
fix
là một hàm nhận một tham số của kiểu t -> t
và trả về kết quả của kiểu t
.
x
,y
,z
đều giống nhauNum
loại eric, nhưng họ vẫn có thể đượcInteger
s,Double
s,Ratio Integer
s ... Haskell là sẵn sàng để thực hiện một sự lựa chọn tùy ý giữa các loại số, nhưng không phải cho typeclasses khác.