Suy luận kiểu là gì?
Về mặt lịch sử, suy luận kiểu (hoặc loại tái thiết) có nghĩa là tất cả loại trong một chương trình có thể được bắt nguồn mà không đòi hỏi cơ bản bất kỳ rõ ràng kiểu chú thích. Tuy nhiên, trong những năm gần đây, nó đã trở nên thịnh hành trong dòng chính ngôn ngữ lập trình để gắn nhãn ngay cả những hình thức nhỏ nhất của loại khấu trừ từ dưới lên dưới dạng "suy luận kiểu" (ví dụ: khai báo auto
mới của C++ 11). Vì vậy, mọi người đã bắt đầu thêm "đầy đủ" để chỉ điều "thực".
đầy đủ suy luận loại nào?
Có phổ rộng với mức độ ngôn ngữ có thể suy ra các loại, và trong thực tế, hầu như không có ngôn ngữ nào hỗ trợ suy luận kiểu "đầy đủ" theo nghĩa hẹp nhất (lõi ML là ví dụ duy nhất). Nhưng yếu tố phân biệt chính là liệu các loại có thể được bắt nguồn cho các ràng buộc không có một "định nghĩa" gắn liền với chúng — cụ thể, các tham số của hàm. Nếu bạn có thể viết, giả sử,
f(x) = x + 1
và hệ thống kiểu con số ra rằng f. có loại Int → Int, sau đó nó có ý nghĩa để gọi suy luận kiểu này. Hơn nữa, chúng ta nói về đa hình suy luận kiểu khi nào, ví dụ,
g(x) = x
được gán kiểu generic & forall; (t) t → t tự động.
Suy luận kiểu được phát minh trong bối cảnh phép tính lambda đơn giản, và suy luận kiểu đa hình (còn gọi là suy luận kiểu Hindley/Milner, được phát minh vào thập niên 1970) là yêu sách của họ ML ngôn ngữ (Standard ML) , OCaml, và được cho là Haskell).
Giới hạn của suy luận kiểu đầy đủ là gì?
Core ML có sự sang trọng của suy luận kiểu đa hình "đầy đủ". Nhưng nó bản lề trên những hạn chế nhất định của đa hình trong hệ thống kiểu của nó. Đặc biệt, chỉ các định nghĩa mới có thể là chung, chứ không phải các đối số hàm. Đó là,
id(x) = x;
id(5);
id(True)
hoạt động tốt, vì id
có thể được loại đa hình khi định nghĩa được biết đến. Nhưng
f(id) = (id(5); id(True))
không nhập kiểm tra ML, vì id
không thể đa hình làm đối số chức năng.Nói cách khác, hệ thống kiểu không cho phép các loại đa hình như & forall; (t) t → t, nhưng không được gọi là các loại đa hình bậc cao như (& forall; (t) t → t) → Bool, trong đó các giá trị đa hình được sử dụng theo cách thứ nhất (mà, chỉ cần rõ ràng, ngay cả rất ít ngôn ngữ được gõ một cách rõ ràng cho phép).
Tính toán lambda đa hình (còn được gọi là "Hệ thống F"), được nhập rõ ràng, cho phép sau này. Nhưng nó là một kết quả tiêu chuẩn trong lý thuyết loại mà tái thiết cho toàn bộ hệ thống F là không thể xác định. Hindley/Milner đạt được một vị trí ngọt ngào của một hệ thống kiểu ít biểu cảm hơn mà việc tái thiết loại vẫn là quyết định.
Có nhiều tính năng hệ thống kiểu nâng cao hơn cũng làm cho việc xây dựng lại kiểu không thể xác định được. Và có những người khác giữ cho nó rõ ràng nhưng vẫn làm cho nó không khả thi, ví dụ: sự hiện diện của quá tải hoặc subtyping ad-hoc, bởi vì điều đó dẫn đến vụ nổ tổ hợp.
Python và Perl đến. Chúng không được biên dịch ngôn ngữ, nhưng điều đó hầu như không liên quan. Có những tình huống mà suy luận kiểu không phải là DWIM - theo kinh nghiệm của tôi Python hơi quá hoang tưởng, và Perl hơi quá thoải mái. – tripleee
python và perl là các ngôn ngữ lập trình được nhập động, các kiểu được gắn với giá trị/vars tại * thời gian chạy *, khi tôi hỏi về ngôn ngữ mà các kiểu được thiết lập tại thời gian biên dịch * ngôn ngữ được gõ tĩnh, hoàn toàn kiểu * – fedvasu
Bạn đã thử đọc http://en.wikipedia.org/wiki/Type_inference chưa? Ngoài ra, ý nghĩa đầy đủ kiểu suy luận là gì? – Euphoric