2012-12-15 29 views
5

Hãy nói rằng tôi muốn xác định một cây như thế này:Thay thế cho không được chấp nhận -XDatatypeContext?

{-# LANGUAGE DatatypeContexts #-} 
class Node a where 
    getContent :: (Num a) => a 

data (Node a) => Tree a = Leaf a 
         | Branch a (Tree a) (Tree a) 

-XDatatypeContexts bị phản đối ngay bây giờ. Có thể làm một cái gì đó tương tự mà không có nó?

Trả lời

13

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ố.

+0

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

+0

@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ó. –

+0

Ồ, đúng rồi, tôi hiểu rồi. – Jake

Các vấn đề liên quan