Tenho alguns cálculos marcados com um tipo ('A/'B) de um tipo específico (T). Gostaria de eventualmente depender do tipo do código, então mapeio o tipo de volta, usando uma instância:
data T = A | B -- also generates types 'A and 'B
class R (t :: T) where r :: Proxy t -> T
instance R 'A where r _ = A
instance R 'B where r _ = B
foo :: forall (t :: T) . R t => Bar T Int
foo = case r (Proxy :: Proxy t) of A -> ....
Isso é ok, mas eu me pergunto se eu posso poupar a escrita da R t
restrição o tempo todo, se eu de qualquer forma tiver o tipo t
anotado com o kind. Alguma reorganização desse esquema é possível para uso mais conveniente? Obrigado.
(Edição de título: originalmente escrevi família de tipos fechada, mas aqui é mais um conjunto fechado de tipos para o tipo fornecido.)