2013-01-23 16 views
29

Giả sử một nhà thiết kế thư viện Haskell quyết định sử dụng UndecidableInstances vì một số lý do. Thư viện biên dịch tốt. Bây giờ giả sử một số chương trình sử dụng thư viện (như định nghĩa một số cá thể của các lớp kiểu của nó), nhưng không sử dụng phần mở rộng. Nó có thể xảy ra rằng việc biên dịch thất bại (không chấm dứt)?Có thể sử dụng UndecidableInstances pragma tại địa phương có hậu quả toàn cầu về việc chấm dứt biên dịch không?

Nếu kịch bản như vậy có thể xảy ra, tôi rất vui khi thấy ví dụ. Ví dụ: mtl sử dụng UndecidableInstances rất nhiều, bạn có thể viết chương trình phụ thuộc vào mtl (hoặc bất kỳ thư viện chuẩn nào khác sử dụng tiện ích mở rộng) không tự sử dụng UndecidableInstances, nhưng không biên dịch được vì không thể xác định?

Trả lời

22

Câu hỏi hay!

Nói chung điều này chắc chắn là có thể. Xem xét mô-đun này:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-} 

module M where 

class C a b | a -> b where 
    f :: a -> b 

instance C a b => C [a] [b] 
    where f = map f 

Nó tự biên dịch tốt. Tuy nhiên, nếu bạn nhập module này và xác định

g x = x + f [x] 

bạn sẽ nhận được

Context reduction stack overflow; size = 201 
Use -fcontext-stack=N to increase stack size to N 
    C [b] b 
In the second argument of `(+)', namely `f [x]' 
In the expression: x + f [x] 
In an equation for `g': g x = x + f [x] 

Về các trường hợp mtl, tôi không thấy như thế nào một cái gì đó như thế này là có thể, nhưng tôi cũng không có bằng chứng rằng nó không phải.

+5

Tôi đã chơi với giải pháp của bạn và tôi quản lý để cắt nó xuống 'lớp C một nơi f :: a -> a' và' dụ C [[a]] => C [a] trong đó f = id' , không cần bất kỳ tiện ích mở rộng nào khác ngoài 'UndecidableInstances'. –

+4

Sau khi kiểm tra nó 'mtl', tôi tin rằng nó không thể làm cho trình biên dịch lặp lại bằng cách sử dụng nó. Lý do duy nhất nó cần phần mở rộng là vì một số trường hợp của nó không thành công trong [Điều kiện bảo hiểm] (http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/type-class-extensions.html# instance-rules). Nhưng ý tưởng đằng sau điều kiện được thỏa mãn - tất cả các biến kiểu rhs có thể được suy ra từ các khai báo cá thể 'mtl'. –

+0

Huh, tôi ngạc nhiên 'C [[a]]' không yêu cầu 'FlexibleContexts'. –

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