Làm thế nào để tôi hiểu các quy tắc Hindley-Milner?
Hindley-Milner là một bộ quy tắc dưới dạng tính toán tuần tự (không phải khấu trừ tự nhiên) chứng tỏ rằng chúng ta có thể suy ra loại (chung nhất) của một chương trình từ việc xây dựng chương trình mà không cần khai báo loại rõ ràng.
Các ký hiệu và ký hiệu
Trước tiên, hãy giải thích các biểu tượng và thảo luận về quyền ưu tiên của nhà điều hành
- 𝑥 là một định danh (không chính thức, một tên biến).
- : có nghĩa là một loại (không chính thức, một thể hiện của hoặc "is-a").
- σ(sigma) là một biểu thức có nghĩa là hoặc là một biến hoặc chức năng.
- do đó : được đọc " 𝑥 là-a 𝜎 "
- Có nghĩa là "là một yếu tố của"
- (Gamma) là một môi trường.
- ⊦ (dấu hiệu khẳng định) có nghĩa là khẳng định (hoặc chứng minh, nhưng theo ngữ cảnh "khẳng định" đọc tốt hơn.)
- ⊦ Γ 𝑥 : σ là như vậy, đọc "Γ khẳng định 𝑥 rằng, là một- σ "
- 𝑒 là một ví dụ thực tế (element) của loại σ .
- τ (tau) là một loại: hoặc cơ bản, biến ( α ), chức năng τ → τ 'hoặc sản phẩm τ × τ' (sản phẩm không được sử dụng ở đây)
- 𝜏 → ' là một loại chức năng trong đó 𝜏 và ' là các loại có khả năng khác nhau.
λ𝑥.𝑒 phương tiện λ (lambda) là một chức năng vô danh mà phải mất một cuộc tranh cãi, 𝑥 , và trả về một biểu thức, 𝑒 .
hãy 𝑥 = 𝑒₀ trong 𝑒₁ phương tiện trong ngôn luận, 𝑒₁ , thay 𝑒₀ bất cứ nơi nào 𝑥 xuất hiện.
Có nghĩa là phần tử trước là một kiểu con (không chính thức - lớp con) của phần tử sau.
- α là một loại biến.
- ∀ α.σ là một loại, ∀ (cho tất cả) các biến đối số, α , trở σ biểu
- ∉ free (𝚪) có nghĩa không phải là một yếu tố của các biến loại tự do của 𝚪 được xác định trong bối cảnh bên ngoài. (Biến giới hạn là thay thế.)
Tất cả mọi thứ trên dòng là tiền đề, mọi thứ bên dưới là kết luận ( Per Martin-Löf )
Ưu tiên, ví dụ
Tôi đã lấy một số ví dụ phức tạp hơn từ các quy tắc và chèn các dấu ngoặc đơn thừa có ưu tiên:
- : 𝜎 ∈ có thể được viết (𝑥: 𝜎) ∈
Γ ⊦ 𝑥 : σ có thể được viết Γ ⊦ ( 𝑥 : σ )
Γ ⊦ hãy 𝑥 = 𝑒₀ trong 𝑒₁ : τ
là tương đương Γ ⊦ (( hãy ( 𝑥 = 𝑒₀ ) trong 𝑒₁ ): τ )
𝚪 ⊦ .𝑒 : 𝜏 → ' tương đương ⊦ (( 𝜆𝑥.𝑒 ): ( 𝜏 → 𝜏' ))
Sau đó, các khoảng trắng lớn ngăn cách các câu lệnh khẳng định và các điều kiện tiên quyết khác chỉ ra một tập hợp các điều kiện tiên quyết như vậy, và cuối cùng là tiền đề ngăn cách đường ngang từ kết luận đưa ra kết thúc của thứ tự ưu tiên.
Những quy định
Điều gì sau đây là các giải thích tiếng Anh của các quy tắc, mỗi sau đó là một sự nghỉ ngơi lỏng lẻo và một lời giải thích.
Biến đổi
Cho là một loại (sigma), một phần tử của 𝚪 (Gamma),
kết luận khẳng định 𝑥 là một.
Nói cách khác, trong, chúng ta biết thuộc loại 𝜎 vì thuộc loại 𝜎 trong.
Điều này về cơ bản là một tautology. Tên định danh là một biến hoặc một chức năng.
Ứng dụng chức năng
Cho 𝚪 khẳng định 𝑒₀ là một loại chức năng và khẳng định 𝑒₁ là một 𝜏
kết luận 𝚪 khẳng định áp dụng chức năng 𝑒₀ cho là một loại 𝜏 '
Để lặp lại quy tắc, chúng ta biết rằng ứng dụng hàm trả về loại 𝜏 'vì hàm này có loại 𝜏 →' và nhận được một đối số của loại.
Điều này có nghĩa là nếu chúng ta biết rằng một hàm trả về một loại và chúng ta áp dụng nó cho một đối số, kết quả sẽ là một thể hiện của loại mà chúng ta biết nó trả về.
Chức năng trừu tượng hóa
Cho 𝚪 và loại 𝜏 khẳng định 𝑒 là một loại, 𝜏 '
kết luận 𝚪 khẳng định một hàm ẩn danh, 𝜆 của biểu thức trả về, 𝑒 thuộc loại 𝜏 →'.
Một lần nữa, khi chúng ta thấy một hàm lấy và trả về một biểu thức, chúng ta biết nó thuộc loại 𝜏 → 'vì (a) khẳng định rằng 𝑒 là một'.
Nếu chúng ta biết thuộc loại 𝜏 và do đó một biểu thức 𝑒 thuộc loại 𝜏 ', thì hàm của biểu thức trả về 𝑒 thuộc loại 𝜏 →'.
Hãy khai báo biến
Cho 𝚪 khẳng định 𝑒₀, loại 𝜎 và và, loại 𝜎, khẳng định 𝑒₁ loại 𝜏
kết luận khẳng định let
𝑥 = 𝑒₀ in
loại 𝜏
Một cách lỏng lẻo, bị ràng buộc với 𝑒₀ trong (a) vì là một và là một 𝜎 khẳng định 𝑒₁ là một.
Điều này có nghĩa là nếu chúng ta có một biểu thức đó là (là biến hoặc hàm) và một số tên,, cũng là và biểu thức loại 𝜏, thì chúng ta có thể thay thế cho 𝑥 bất cứ khi nào nó xuất hiện bên trong của 𝑒₁.
Khởi tạo
Cho 𝚪 khẳng định 𝑒 loại 𝜎 'và' là một kiểu con của
kết luận 𝚪 khẳng định 𝑒 thuộc loại 𝜎
Một biểu thức, 𝑒 thuộc kiểu cha vì biểu thức là kiểu con 'và là kiểu cha của 𝜎'.
Nếu một thể hiện thuộc loại là một kiểu con của loại khác, thì đó cũng là một thể hiện của loại siêu đó - loại tổng quát hơn.
Sự khái quát
Cho 𝚪 khẳng định 𝑒 là 𝜎 và không phải là phần tử của các biến tự do của,
kết luận khẳng định, nhập cho tất cả các biểu thức đối số 𝛼 trả về biểu thức
Vì vậy, nói chung, được gõ cho tất cả các biến đối số (𝛼) trả về, vì chúng ta biết rằng 𝑒 là một và không phải là biến tự do.
Điều này có nghĩa là chúng ta có thể khái quát hóa một chương trình để chấp nhận tất cả các loại đối với các đối số chưa bị ràng buộc trong phạm vi chứa (các biến không phải là không cục bộ). Các biến ràng buộc này là thay thế.
Để tất cả chúng cùng nhau
Với các giả định nhất định (chẳng hạn như không có biến tự do / không xác định, môi trường đã biết), chúng tôi biết các loại:
- yếu tố nguyên tử của các chương trình của chúng tôi (Biến),
- các giá trị được trả về bởi các hàm (Ứng dụng hàm),
- cấu trúc chức năng (Trừu tượng chức năng),
- hãy để các ràng buộc (Hãy khai báo biến),
- các kiểu cha mẹ (Khởi tạo) và
- tất cả các biểu thức (Khái quát hóa).
Phần kết luận
Các quy tắc này kết hợp cho phép chúng tôi chứng minh loại chung nhất của chương trình được xác nhận, mà không yêu cầu chú thích loại.