Vì vậy, tôi quen thuộc với hai chiến lược chính là có tính đa hình được xếp hạng cao hơn trong một ngôn ngữ:
- Tính đa hình kiểu System-F, trong đó các hàm được gõ rõ ràng và việc khởi tạo xảy ra rõ ràng mặc dù ứng dụng kiểu. Các hệ thống này có thể là bắt buộc.
- Đa hình dựa trên phân loại, trong đó một loại đa hình là một kiểu con của tất cả các tức thời của nó. Để có phân nhóm có thể quyết định, tính đa hình phải là dự đoán. Bài viết này cung cấp một ví dụ về một hệ thống như vậy.
Tuy nhiên, một số ngôn ngữ, như Haskell, có tính đa hình xếp hạng cao hơn mà không có ứng dụng loại rõ ràng.
Sao có thể như thế được? Làm thế nào có thể kiểm tra kiểu "biết" khi nào khởi tạo một loại mà không cần khởi tạo rõ ràng hoặc truyền và không có khái niệm về phân nhóm?
Hoặc, là đánh máy thậm chí có thể quyết định trong một hệ thống như vậy? Đây có phải là trường hợp mà ngôn ngữ như Haskell thực hiện một cái gì đó không thể giải quyết được sẽ xảy ra với hầu hết các trường hợp sử dụng của mọi người.
BIÊN TẬP:
Để rõ ràng, tôi quan tâm đến việc sử dụng , không phải định nghĩa, về các giá trị được đánh máy đa hình.
Ví dụ: giả sử chúng ta có:
f : forall a . a -> a
g : (forall a . a -> a) -> Int
val = (g f, f True, f 'a')
Làm thế nào chúng ta có thể biết rằng chúng ta cần khởi tạo f
khi nó được áp dụng, nhưng không phải khi nó được đưa ra như một đối số?
Hoặc, để tách chúng ta khỏi các loại chức năng:
f : forall a . a
g : (forall a . a) -> Int
val = (g f, f && True, f + 0)
Ở đây, chúng ta thậm chí không thể phân biệt việc sử dụng f
như áp dụng nó so với việc chuyển nó: nó được khởi tạo khi được truyền dưới dạng đối số &&
và +
, nhưng không g
.
Làm thế nào một hệ thống lý thuyết có thể phân biệt hai trường hợp này mà không có quy tắc "bạn có thể chuyển đổi bất kỳ loại đa hình nào sang thể hiện của nó"? Hoặc với một quy tắc như vậy, chúng ta có thể biết khi nào nên áp dụng nó, để giữ tính quyết định?
g
mong đợi một polytype, và ngăn chặn việc khởi tạo f
.
\f -> (f True, f 'a')
sẽ không kiểm tra loại, ngay cả khi có thể được chỉ định loại(forall t. t->t) -> (Bool, Char)