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.)
O mais próximo que posso chegar do que você quer é usar
PartialTypeSignatures
o GHC para inferir as restrições, da seguinte forma:Isso ainda gerará avisos para o uso de
_
, que podem ser silenciados com o sinalizador do compilador-Wno-partial-type-signatures
.Como sempre, ao usar inferência, tenha cuidado. Pode acontecer que o GHC acidentalmente infira restrições diferentes das que você pretendia usar, tornando
foo
a compilação boa, mas causando erros de tipo misteriosos quandofoo
for usado mais tarde. A inferência é ótima, mas pode ser fonte de muita confusão às vezes.