Tôi hy vọngchữ ký Kind và Gõ gia đình
type family Rep a
và
type family Rep :: * -> *
là giống nhau, nhưng có vẻ như đó là một sự khác biệt
type family Rep a
type instance Rep Int = Char
-- ok
type family Rep :: * -> *
type instance Rep Int = Char
-- Expected kind * -> *, but got 'Int' instead
đã tôi chỉ đơn giản vấp trên một Lỗi mở rộng Haskell, hoặc có một số điểm cho hành vi này?
Điểm là loại gia đình không phải là 'chức năng mức loại'. Họ là 'gia đình các loại'. Bạn nên xem các sự tương đồng cú pháp giữa kiểu mẫu khớp giá trị và khai báo cá thể kiểu gia đình như trùng hợp ngẫu nhiên - hai ngữ nghĩa hoàn toàn khác nhau (ví dụ: thử viết hàm mức giá trị khớp với hàm tạo 'Left :: a -> Hoặc ab '). Bạn đã chứng kiến một ví dụ tối thiểu về sự khác biệt. Loại gia đình thứ 2 về cơ bản chỉ là một từ đồng nghĩa kiểu, vì nó chỉ có thể có một cá thể duy nhất. The 1st là một gia đình loại thích hợp. – user2407038
Tôi ước tôi có một cách đơn giản để giải thích sự khác biệt giữa 'chức năng loại mức' và 'họ của các loại', nhưng tôi thì không. Sự khác biệt xuất phát từ thực tế là gia đình loại 1 không thể áp dụng một phần (cũng không phải là thứ 2, tất nhiên, nhưng bất kỳ việc sử dụng thứ 2 là một ứng dụng bão hòa, vì phải mất 0 đối số) - nói cách khác, loại thứ nhất gia đình không có loại có thể được gán cho nó trong hệ thống kiểu Haskell. – user2407038