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ì b
và c
đề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:
- Có bất kỳ vấn đề có thể với việc sử dụng
UndecidableInstances
đây - 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?)
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
c được xác định bằng cách nào? – Saizan