Tôi đang gặp khó khăn trong việc hiểu loại Cao hơn hoặc Loại xếp hạng cao hơn. Loại khá đơn giản (nhờ tài liệu Haskell cho điều đó) và tôi đã từng nghĩ xếp hạng giống như loại khi nói về các loại nhưng dường như không phải! Tôi đã đọc bài viết trên Wikipedia để không có kết quả. Vì vậy, ai đó có thể vui lòng giải thích một thứ hạng là gì? và thứ hạng cao hơn nghĩa là gì? Xếp hạng cao hơn đa hình? làm thế nào mà nói đến các loại (nếu có)? So sánh Scala và Haskell cũng sẽ rất tuyệt vời.Loại so với xếp hạng theo lý thuyết loại
Trả lời
Khái niệm xếp hạng không thực sự liên quan đến khái niệm về các loại.
Thứ hạng của hệ thống loại đa hình mô tả nơi forall
s có thể xuất hiện trong các loại. Trong hệ thống loại xếp hạng 1, forall
s chỉ có thể xuất hiện ở cấp ngoài cùng, trong hệ thống loại xếp hạng 2, chúng có thể xuất hiện ở một mức làm tổ và vân vân.
Vì vậy, ví dụ: forall a. Show a => (a -> String) -> a -> String
sẽ là loại xếp hạng 1 và forall a. Show a => (forall b. Show b => b -> String) -> a -> String
sẽ là loại xếp hạng 2. Sự khác biệt giữa hai loại đó là trong trường hợp đầu tiên, đối số đầu tiên của hàm có thể là bất kỳ hàm nào có một đối số có thể hiển thị và trả về một Chuỗi. Vì vậy, một chức năng của loại Int -> String
sẽ là một đối số đầu tiên hợp lệ (như một hàm giả thiết intToString
), do đó, sẽ có một chức năng của loại forall a. Show a => a -> String
(như show
). Trong trường hợp thứ hai, chỉ một hàm thuộc loại forall a. Show a => a -> String
sẽ là đối số hợp lệ, tức là show
sẽ không sao, nhưng intToString
sẽ không được. Kết quả là các chức năng sau đây sẽ là một chức năng pháp lý của loại thứ hai, nhưng không phải là người đầu tiên (trong đó ++
là nghĩa vụ phải đại diện cho chuỗi nối):
higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42)
Lưu ý rằng đây chức năng f
được áp dụng cho (khả năng) ba loại đối số khác nhau. Vì vậy, nếu f
là chức năng intToString
điều này sẽ không hoạt động.
Cả Haskell và Scala đều là Hạng 1 (do đó, hàm trên không thể được viết bằng các ngôn ngữ đó) theo mặc định. Nhưng GHC chứa một phần mở rộng ngôn ngữ để cho phép đa hình Rank-2 và một số khác để cho phép đa hình Rank-n cho tùy ý n.
chúng ta không thể nói rằng xếp hạng đủ điều kiện biến loại, trong khi các loại đủ điều kiện loại hằng số? – didierc
@didierc Tôi không hoàn toàn chắc chắn ý bạn là gì, nhưng tôi không nghĩ vậy. Cả hai loại biến và loại hằng số đều có các loại. – sepp2k
Bạn có thể dễ dàng mã hóa các loại xếp hạng cao hơn trong scala. Xem http://www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf, phần 7.2. –