Supponiamo che io ho la seguente classe:Haskell classi di tipo ereditare
class P a where
nameOf :: a -> String
vorrei dichiarare che tutte le istanze di questa classe sono automaticamente istanze di Show
. Il mio primo tentativo sarebbe il seguente:
instance P a => Show a where
show = nameOf
Il mio primo tentativo di andare in questo modo ieri ha provocato un labirinto di coniglio di estensioni del linguaggio: casi che io è stato detto di accendere le istanze flessibili, le istanze quindi indecidibili, poi sovrapposti, e infine ottenere un errore sulla sovrapposizione delle dichiarazioni di istanza. Ho rinunciato e sono tornato a ripetere il codice. Tuttavia, questo sembra fondamentalmente una domanda molto semplice, che dovrebbe essere facilmente soddisfatta.
Così, due domande:
- C'è un modo banalmente facile per fare questo che ho appena perso?
- Perché si verifica un problema di istanze sovrapposte? Posso capire perché potrei aver bisogno di
UndecidableInstances
, poiché sembra che stia violando la condizione di Paterson, ma non ci sono istanze sovrapposte qui intorno: non ci sono istanze diP
, pari. Perché il tipografo ritiene che ci siano più istanze per (come sembra essere il caso in questo esempio di giocattolo)?
La sovrapposizione (e la risoluzione di sovraccarico) è determinata solo dalla testa dell'istanza 'Mostra a', quindi effettivamente si sovrappone a ogni altra istanza' Mostra'. – augustss
Supponiamo che tu dichiari l'istanza di 'P Int' e che tu abbia già un'istanza per' Show Int', quindi questo si tradurrà in istanze sovrapposte per Show. – Satvik
@Satvik Sure, tranne per il fatto che non ho un'istanza di 'P Int' intorno. Mi aspetterei un errore se provassi a creare un 'P Int', ma non semplicemente dichiarando che potrebbe esistere. – Impredicative