Bạn có chắc chắn chắc chắn ngữ cảnh kiểu dữ liệu thực sự đã làm những gì bạn nghĩ? Đó là deprecated because it was basically useless và được coi là một sự không hài lòng, vì tất cả điều đó đã buộc bạn phải thêm các ràng buộc thêm mà không cung cấp bất kỳ sự bảo đảm nào về các loại ngoài những gì bạn đã có mà không có nó.
Việc thay thế, chẳng hạn như, thực tế là không điều gì đó hữu ích, là GADT syntax. Tương đương với loại của bạn sẽ trông như thế này:
data Tree a where
Leaf :: (Node a) => a -> Tree a
Branch :: (Node a) => a -> Tree a -> Tree a -> Tree a
Trong trường hợp này, bạn cần Node
khăn khi tạo ra một giá trị Tree
, nhưng khi mô hình kết hợp trên một giá trị Tree
bạn cũng nhận được một bảo đảm tự rằng một trường hợp Node
tồn tại, làm cho cá thể có sẵn mà thậm chí không cần nó trong loại hàm nhận Tree a
làm đối số.
Nguồn
2012-12-15 02:34:02
Cảm ơn bạn rất nhiều! Mặc dù tôi nghĩ rằng bạn có nghĩa là Chi nhánh :: (Node a) => a -> Tree a -> Tree a – Jake
@Jake: Không - nó hoạt động giống như chữ ký kiểu hàm, vì vậy 'Cây a' cuối cùng là kết quả loại dữ liệu. 'a -> Cây a -> Cây a' sẽ chỉ có một cây con. So sánh loại của hàm tạo 'Branch' bạn hiện có. –
Ồ, đúng rồi, tôi hiểu rồi. – Jake