Xin lỗi, tôi không thể tưởng tượng ra bất kỳ tiêu đề nào tốt hơn cho câu hỏi, vì vậy hãy đọc trước. Hãy tưởng tượng rằng chúng tôi có một gia đình kiểu khép kín mà các bản đồ tất cả các loại để nó tương ứng Maybe
trừ maybes mình:Loại gia đình và loại chức năng lạ
type family Family x where
Family (Maybe x) = Maybe x
Family x = Maybe x
Chúng tôi thậm chí có thể khai báo một hàm sử dụng loại gia đình:
doMagic :: a -> Family a
doMagic = undefined
exampleA = doMagic $ Just()
exampleB = doMagic $()
Chơi với nó trong GHCi cho thấy rằng nó là ok để đánh giá loại ứng dụng chức năng này:
*Strange> :t exampleA
exampleA :: Maybe()
*Strange> :t exampleB
exampleB :: Maybe()
câu hỏi đặt ra là nếu nó có thể cung cấp bất kỳ TRIỂN KHAI trên chức năng doMagic
trừ undefined
? Ví dụ, giả sử rằng tôi muốn bọc mọi giá trị vào một hàm tạo Just
, ngoại trừ Maybes vẫn còn nguyên vẹn, làm cách nào tôi có thể làm điều đó? Tôi đã thử sử dụng typeclasses, nhưng không viết được chữ ký compileable cho chức năng doMagic nếu không sử dụng các loại gia đình khép kín, ai đó có thể giúp tôi được không?
Trong ngôn ngữ được nhập động 'doMagic x = Just undefined' cũng sẽ tôn trọng các loại. Về mặt lý thuyết, một hệ thống kiểu có thể cho phép điều này (nhưng điều đó có thực sự hữu ích không?). BTW, ví dụ bạn mô tả, nếu bạn làm những thứ khác nhau tùy thuộc vào loại bê tông 'a' là, sẽ yêu cầu thông tin kiểu khi chạy, trong khi Haskell được thiết kế để cho phép xóa kiểu (không có thông tin kiểu khi chạy). Bạn có thể nhận được một cái gì đó gần bằng cách sử dụng một lớp loại, mặc dù. – chi
Hơn nữa, câu hỏi có vẻ liên quan đến "định lý _ miễn phí của một loại trong sự hiện diện của các họ loại khép kín là gì?". – chi