2012-01-31 17 views
5

Wen sử dụng các phụ thuộc chức năng, tôi thường xuyên truy cập Điều kiện Bảo hiểm . Có thể nhấc nó lên với UndecidableInstances, nhưng tôi thường cố tránh xa phần mở rộng đó.Cách nhận Điều kiện Bảo hiểm cho các Phụ thuộc Chức năng mà không sử dụng -XUndecidableInstances

Dưới đây là một ví dụ hơi giả tạo, làm việc mà không UndecidableInstances:

{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} 

data Result = Result String 
    deriving (Eq, Show) 

data Arguments a b = Arguments a b 

class Applyable a b | a -> b where 
    apply :: a -> b -> Result 

instance Applyable (Arguments a b) (a -> b -> Result) where 
    (Arguments a b) `apply` f = f a b 

Khi tôi làm cho các loại kết quả chung chung hơn, Điều kiện Bảo hiểm thất bại (do đó đòi hỏi UndecidableInstances):

{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-} 

data Result a = Result a 
    deriving (Eq, Show) 

data Arguments a b = Arguments a b 

class Applyable a b c | a -> b c where 
    apply :: a -> b -> Result c 

instance Applyable (Arguments a b) (a -> b -> Result c) c where 
    (Arguments a b) `apply` f = f a b 

tôi nghĩ rằng vì bc đều được xác định bởi a, mã chung hơn sẽ không gây ra bất kỳ sự cố nào, do đó, câu hỏi của tôi:

  1. Có bất kỳ vấn đề có thể với việc sử dụng UndecidableInstances đây
  2. Tôi có thể mô hình kịch bản trên mà không dựa vào UndecidableInstances (có thể với gia đình loại?)
+7

Không có lý do chính đáng để tránh xa 'UndecidableInstances'. Điều tồi tệ nhất có thể xảy ra là trình kiểm tra kiểu bắt đầu lặp (và cho bạn biết về nó, tôi nghĩ). Bạn có thể làm cho điều kiện bảo hiểm ngày càng thông minh hơn, nhưng nó sẽ không bao giờ làm mọi thứ bạn có thể muốn vì điều đó là không thể tránh khỏi. – augustss

+0

c được xác định bằng cách nào? – Saizan

Trả lời

7

Không có lý do lớn để tránh xa UndecidableInstances . Điều tồi tệ nhất có thể xảy ra là trình kiểm tra kiểu bắt đầu lặp (và cho bạn biết về nó, tôi nghĩ). Bạn có thể làm cho điều kiện bảo hiểm ngày càng thông minh hơn, nhưng nó sẽ không bao giờ làm mọi thứ bạn có thể muốn vì điều đó là không thể tránh khỏi.

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