2016-04-03 23 views
5

ottengo il seguente errore dalla GHC per la mia biblioteca servo:"Nessuna istanza per" l'errore - ma esiste l'istanza (tipo non corrisponde)

No instance for (GetEndpoint 
         (Verb 'GET 200 '[JSON] Position) 
         (Verb 'GET 200 '[JSON] Position) 
         'True) 
arising from a use of `callServer3' 

ma ho un esempio nel campo di applicazione, che sembra quello:

instance GetEndpoint (Verb n s ct a) (Verb n s ct a) 'True where 
    getEndpoint _ _ _ _ server = server 

che sembra esattamente come quello che un ghc non riesce a trovare. Sono un po 'confuso adesso.

codice completo può essere trovato qui:

Eventuali indizi? Grazie mille per ogni suggerimento!

+4

sei sicuro che i tuoi 'tipi' sono giusti (' 'GET' contro '*' etc) (la tua istanza dovrebbe apparire come '(Verbo (n :: GET) (s :: Nat) ..)' (nota che non sono sicuro sul 'Nat' qui ^^) – Carsten

+0

Grazie mille Carsten - questo ha fatto il trucco - pubblicherò una risposta una volta risolti gli altri errori che stanno spuntando. – robert

risposta

5

L'istanza data ha tipo predefinito '*' per n s ct e a. O utilizzare tipi poli come per n oi tipi di cemento a destra:

(Verb (n :: k1) (s :: Nat) (ct :: [*]) a) 

la correttezza esempio sarebbe simile a questa:

instance GetEndpoint (Verb (n :: k1) (s :: Nat) (ct :: [*]) a) (Verb n s ct a) 'True where 
    getEndpoint _ _ _ _ server = server 

Se non si desidera attivare PolyKinds (ha introdotto una serie di altri errori), è possibile utilizzare il più ristretto StdMethod per n:

instance GetEndpoint (Verb (n :: StdMethod) (s :: Nat) (ct :: [*]) a) (Verb n s ct a) 'True where 
    getEndpoint _ _ _ _ server = server 

codice completo (compilazione e anche di lavoro come previsto), si possono trovare here.

Grazie ancora Carsten per questo aiuto davvero veloce!

+1

PolyKinds introdurrà spesso di errori se abilitati all'improvviso - per impostazione predefinita il tipo di una variabile di tipo assume come valore predefinito '*' se non specificato, ma con PolyKinds i tipi di variabili di tipo sono generalizzati ad una nuova variabile di tipo.Nota anche che non è necessario un tipo annotazione su ogni occorrenza di una variabile di tipo - uno qualsiasi è sufficiente. – user2407038

+0

Huh - buona cattura, sono così abituato a copiare incollare con la programmazione a livello di tipo, che non ci ho nemmeno pensato - ma ha molto senso che il l'annotazione è necessaria solo una volta. – robert

Problemi correlati