ho un "lineare" di tipo familiare, cioè della formaInversione di una famiglia tipo
type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
Nel mio particualr caso d'uso, è molto comodo per definire il "reverse" famiglia FooRev
e poi rispettare il vincolo (FooRev (Foo x) ~ x)
:
type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
la famiglia inversa consente GHC inferire molti tipi che altrimenti sarebbero ambiguo a causa del mancato iniettivita. È essenzialmente la stessa idea che è stata proposta here. Questa soluzione funziona piuttosto bene, ma è fastidioso, programmatico e soggetto a errori definire una famiglia di tipo "inverso" elencando tutti i casi. Esiste un modo più generico per definire il contrario di una famiglia lineare come Foo
?
Forse potresti usare in qualche modo le famiglie di 'data', che sono note iniettivo. Non sono sicuro se si adatta al tuo problema. – luqui
La metaprogrammazione (ad esempio il modello Haskell) potrebbe generare entrambi, mantenendo il codice ASCIUTTO se questo è il tuo problema. Altrimenti, è possibile definire un elenco di associazioni a livello di testo, una ricerca a livello di testo, un 'livello di scambio di tipo livello e derivare entrambe le famiglie di tipi dall'elenco. – chi
@luqui L'ho appena visto prima di postare, ma per quanto ne so, non è proprio quello di cui ho bisogno. Nel mio caso, i 'Ti' sono tutti di tipo' Bar a b c' dove cambiano i parametri del tipo. Non andrà bene in una famiglia di dati, vero? – crockeea