2011-09-15 27 views
60

Tôi chỉ làm một số phát triển Haskell và tôi biên dịch lại một số mã cũ trên một phiên bản mới của GHC:DatatypeContexts không được chấp nhận trong GHC mới nhất: Tại sao?

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

Và khi tôi đã làm tôi nhận được lỗi sau:

Warning: -XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.

Đó xuất hiện khi bạn có mã theo định dạng sau:

data Ord a => MyType a 
    = ConstructorOne a 
    = ConstructorTwo a a 

Câu hỏi của tôi là: Tại sao tính năng này không được chấp nhận ngay từ đầu và tôi phải làm gì nstead để đạt được chức năng tương tự hoặc tương tự?

+11

Chỉ cần xóa ngữ cảnh và mã của bạn sẽ vẫn hoạt động. – augustss

+0

Nếu bạn gặp lỗi liên quan khi thử 'cabal install ', sau đó thử 'cabal install --ghc-option '-XDataTypeContexts' '. – ntc2

Trả lời

86

Nó bị phản đối bởi vì nó một misfeature, và không thực sự bất kỳ chức năng hữu ích! Tất cả những gì nó làm là tạo ra một loạt các ràng buộc thêm ở các địa điểm khác. Đặc biệt, khi mô hình khớp với kiểu như vậy, bạn sẽ buộc phải thêm một ràng buộc, thay vì (như ban đầu có thể hy vọng) có quyền truy cập vào một ngữ cảnh, dựa trên kiến ​​thức mà người ta phải có sẵn để xây dựng giá trị ngay từ đầu.

Các "thay thế", mà thực sự hoạt động theo cách khác và theo dõi những bối cảnh được biết đến với bạn, là để use GADT-style declarations instead:

data MyType a where 
    ConstructorOne :: Ord a => a -> MyType a 
    ConstructorTwo :: Ord a => a -> a -> MyType a 

GADTs nói chung là linh hoạt hơn theo nhiều cách khác là tốt, nhưng đối với này trường hợp cụ thể những gì xảy ra là tạo giá trị cần hạn chế Ord, sau đó được mang theo cùng với giá trị và khớp mẫu trên công cụ xây dựng sẽ kéo nó trở lại. Vì vậy, bạn thậm chí không cần bối cảnh về các chức năng sử dụng nó, bởi vì bạn biết rằng bằng cách mong đợi một cái gì đó loại MyType a, bạn sẽ nhận được một ràng buộc Ord a với nó.

+0

Câu cuối cùng có vẻ hơi không rõ ràng - những gì bạn kéo từ hàm tạo GADT không phải là ràng buộc mà là các cá thể thỏa mãn ràng buộc. – dfeuer

+0

Nhưng nếu có quá nhiều nhà xây dựng, nó sẽ không quá dài để lặp lại 'Ord a' cho mỗi nhà xây dựng? – fakedrake

+1

@fakedrake Tôi có nghĩa là điều này không nên đi lên thường xuyên anyway. Bạn hầu như không muốn hạn chế các loại như thế. Một ví dụ cho lý do tại sao nó làm cho nó không thể làm cho loại của bạn một 'Functor',' có thể gập lại', 'Traversable',' Applicative', 'Monad',' Thay thế', 'MonadPlus',' Arrow' và như vậy. – semicolon

-1

Tôi cũng gặp phải lỗi này. Đề xuất của ntc2 đã làm việc cho tôi, ngoại trừ việc nó nên có chữ 't' nhỏ trong 'TypeContext', tức là cabal install --ghc-option '-XDatatypeContexts' <package>

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