Nếu tôi có một loại bị hạn chế bởi một hữu hạn DataKind
Lấy thông tin từ DataKinds hạn chế loại hiện sinh
{-# LANGUAGE DataKinds #-}
data K = A | B
data Ty (a :: K) = Ty { ... }
và một kiểu hiện sinh mà quên đi những lựa chọn chính xác của K
trong các loại ... nhưng nhớ nó trong một trôi qua từ điển.
class AK (t :: K) where k :: Ty t -> K
instance AK A where k _ = A
instance AK B where k _ = B
data ATy where ATy :: AK a => Ty a -> ATy
nó thực sự là trường hợp mà ATy <-> Either (Ty A) (Ty B)
, nhưng nếu tôi muốn viết một trong những nhân chứng tôi cần phải sử dụng unsafeCoerce
getATy :: ATy -> Either (Ty A) (Ty B)
getATy (ATy it) = case k it of
A -> Left (unsafeCoerce it)
B -> Right (unsafeCoerce it)
Vì vậy, nhìn chung các công trình này, tôi có thể quên lựa chọn K
sử dụng ATy
và nhớ một phần sử dụng getATy
. Tất cả điều này tận dụng lợi thế của nhiều thông tin kiểu như tôi có sẵn.
Tuy nhiên, thông tin loại này cảm thấy như thể nó phải là "hiển nhiên" nếu được thực hiện đúng.
Có cách nào để đạt được điều này mà không cần sử dụng unsafeCoerce
không? Có cách nào để thoát khỏi ràng buộc AK
trong sự tồn tại? Kỹ thuật này có thể được thực hiện hoàn toàn dựa trên các ràng buộc thông tin do kiểu dữ liệu cung cấp không?
Ahm ... 'A -> Trái Ty'? – leftaroundabout
Ah, uh, hãy để tôi thay đổi ví dụ để làm cho nó ít tầm thường hơn. Rất tiếc! –
Loại 'K' có thể là ma, nhưng nó truyền tải rất nhiều thông tin. –