2011-12-03 22 views
13

Mi piace mettere le firme di tipo per tutte le definizioni di primo livello nel mio codice. Tuttavia, le firme di tipo nelle dichiarazioni di istanza non sembrano essere consentite e, se ne inserisco una, viene visualizzato un errore di "Segnatura in caratteri errati" da GHC. Perché è così? Perché GHC non può controllare se la firma del tipo è la stessa di quanto si aspettava e rifiutare (o avvisare) se non lo è?Perché non è possibile inserire firme di tipo nelle dichiarazioni di istanza in Haskell?

+3

Su [il biglietto che ho aperto] (http://hackage.haskell.org/trac/ghc/ticket/5676) SPJ ha commentato: "Volevo [digitare firme nelle dichiarazioni di istanza], quindi ho fatto in un momento libero. " Attualmente ha fissato la pietra miliare a GHC 7.6, anche se c'è una leggera possibilità che lo trasformi in GHC 7.4. Grazie per aver chiesto questa domanda! E grazie, Daniel Fischer, per aver suggerito che facciamo un biglietto. –

risposta

10

È possibile creare le funzioni separatamente, al di fuori del corpo dell'istanza, se si specifica le dichiarazioni di tipo.

class Class a where 
    f1 :: a -> a 

instance Class Foo where 
    f1 = foo_f1 

--monomorphic version of f1 for Foo: 
foo_f1 :: Foo -> Foo 
foo_f1 = ... 
4

Poiché la firma fa parte della definizione di classe, una firma di tipo in una dichiarazione di istanza sarebbe una firma duplicata. Non penso che ci sia un problema nel consentire in linea di principio firme duplicate, ma non c'è alcun vantaggio nel consentirle in generale, ed è più semplice disabilitarle. Quindi la definizione della lingua dice che al massimo può esserci una firma di tipo per entità. La funzionalità di consentire le firme anche nelle dichiarazioni di istanza non è stata richiesta per molto, quindi non c'è un'estensione che lo consenta. Se lo desideri davvero, puoi richiedere una richiesta di funzionalità sullo GHC trac. Se riceve abbastanza interesse, può essere implementato (ma non mi aspetto che la domanda sia alta).

+1

Il vantaggio sarà che GHC controllerà la firma - il programmatore può affermare la propria convinzione della firma del tipo e farlo controllare, e catturato nel caso in cui sia sbagliato. – Prateek

+1

@Prateek Il compilatore lo controlla comunque rispetto alla firma nella classe. Poiché qualsiasi firma eccetto quella della definizione di classe (con le variabili di tipo pertinenti sostituite per i tipi di istanza) deve essere rifiutata, non può fornire ulteriori informazioni o sicurezza. Sarebbe solo un po 'di documentazione aggiuntiva per i lettori del codice (non è una brutta cosa, ma puoi ottenerlo ora con le firme nei commenti - lo faccio se penso che i tipi non siano ovvi e ben noti). –

+4

Intendevo verificare contro ciò che il programmatore ritiene che la firma sia (a parte il controllo rispetto alla firma nella classe). Questo non fornisce alcuna sicurezza aggiuntiva, vero. Ma può dare messaggi di errore più comprensibili: "tu pensi che la firma del tipo sia X, ma in realtà è Y" invece di un altro errore di tipo. Inoltre, consente a un programmatore di adottare uno stile uniforme di dichiarazioni del tipo di scrittura, invece di dover creare un caso speciale di commentarlo all'interno delle dichiarazioni di istanza. – Prateek

3

In ogni caso, il tipo è ridondante e normalmente si vuole evitare le ridondanze. In Frege, è tuttavia consentito scrivere firme di tipo per membri di istanza. Sono controllati e poi gettati via. Ovviamente è più facile proibirli subito.

+2

La ridondanza a volte è buona. – ThePiercingPrince

11

È possibile aggiungere firme di tipo per le istanze utilizzando [il nuovo] -XInstanceSigs, che è particolarmente utile per portare le variabili di tipo in ambito. Puoi trovare ulteriori informazioni nello official docs.

Problemi correlati