2012-01-26 25 views
6

Có một "tính năng" gây phiền nhiễu mà các phiên bản phát sinh cũng bị ảnh hưởng bởi tiện ích mở rộng RebindableSyntax. Ví dụ về những gì tôi muốn viết:Haskell - bất kỳ cách nào để tắt cú pháp rebindable đối với trường hợp `deriving` instance?

{-# LANGUAGE RebindableSyntax #-} 
import qualified Prelude 
data Color = Red | Green | Blue | Periwinkle | Fuschia deriving (Prelude.Eq, Prelude.Ord) 

Điều này xảy ra với lỗi "Không nằm trong phạm vi:` ifThenElse '".

+1

Không chắc chắn bạn đang cố gắng làm gì, nhưng nó có giúp chuyển định nghĩa sang tệp khác mà không có 'RebindableSyntax' không? –

Trả lời

7

Điều đó có vẻ giống như một sự không hài lòng đối với tôi - mệnh đề deriving có đầy đủ ma thuật tích hợp, vì vậy tôi hoài nghi rằng các cá thể xuất phát sử dụng cú pháp phục hồi sẽ hữu ích trong thực tế. Bây giờ, nếu bạn cũng có thể tự rebind các khoảnchính nó và sử dụng một mối nối TH thay vì ... nhưng tôi digress.

Tôi nghi ngờ giải pháp đơn giản và dễ nhất là sử dụng các mô-đun khác nhau. Đặt định nghĩa kiểu dữ liệu trong mô-đun riêng của nó, sử dụng mệnh đề deriving ở đó với các hàm Prelude trong phạm vi, sau đó nhập loại trong mô-đun bằng cú pháp có thể rebindable. Nếu bạn cần thêm mô đun trong mô-đun của mình, lưu ý rằng StandaloneDeriving cũng tồn tại và sẽ cho phép bạn xác định các loại trong một mô-đun (với RebindableSyntax hoạt động), lấy các cá thể trong mô-đun khác (không có RebindableSyntax) và nhập cả từ mô-đun thực sự sử dụng loại.

+0

vâng, độc lập phát sinh sẽ cần phải xảy ra trước khi bất kỳ định nghĩa nào yêu cầu cá thể mặc dù, không? tức là bạn không thể ghi 'dữ liệu Color = ...' và một số 'foo :: Màu -> Màu -> Bool',' foo c1 c2 = c1 == c2' nếu chưa có 'Eq' nào được nhập. – gatoatigrado

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