2012-02-14 32 views
5

Có, tôi biết rằng UndecidableInstances có thể không tốt. Tôi thực sự đã cố gắng hết sức để thiết kế mô-đun của mình để không cần đến nó, tuy nhiên tôi có một cái gì đó như thế này:Cách sử dụng UndecidableInstances cục bộ?

instance Foo x (C x y) => Bar (C x y) where 

    ... 

và thay đổi nó sẽ làm cho API xấu hơn đáng kể. Tôi không bao giờ lấy được Foo trong số Bar để không có cách nào tạo vòng lặp.

Mặt khác, kích hoạt UndecidableInstances làm cho những sai lầm ngớ ngẩn dễ bị bỏ qua. Ví dụ: tôi có thể viết nhầm một số điều như:

instance Foo x (C x z) => Bar (C x y) where 

    ... 

nơi z không bao giờ xuất hiện ở bên phải.

Câu hỏi: Có thể sử dụng UndecidableInstances cục bộ trong mô-đun, tức là đánh dấu rõ ràng các địa điểm mà quy tắc chấm dứt thông thường được dỡ bỏ không?

Tất nhiên nó sẽ không giúp chấm dứt, nhưng nó sẽ đưa ra quyết định sử dụng phần mở rộng này thông tin hơn.

Câu hỏi 2: Có điều gì yếu hơn UndecidableInstances vẫn không đảm bảo chấm dứt, nhưng sẽ cấm một số trường hợp đường biên hơn như đoạn mã thứ hai?

Trả lời

4

Cho đến giờ, pragmas ngôn ngữ là theo từng mô-đun, vì vậy câu trả lời cho câu hỏi đầu tiên là không. Đối với câu hỏi thứ hai, tôi không hoàn toàn chắc chắn, nhưng tôi biết không có phần mở rộng nào khác hơn là UndecidableInstances cho phép cá thể đó.

Tuy nhiên, UndecidableInstances không phải là xấu, nó chỉ cho phép trình kiểm tra loại cố gắng giải quyết các trường hợp không thể chứng minh việc chấm dứt. Tuy nhiên, bối cảnh ngăn cản nó thực sự lặp đi lặp lại.

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