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?
risposta
È 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 = ...
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).
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
@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). –
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
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.
La ridondanza a volte è buona. – ThePiercingPrince
È 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.
- 1. Perché Haskell non riesce a dedurre i typeclass del tipo di dati nelle firme delle funzioni?
- 2. Aggiunta di vincoli di tipo al contesto delle dichiarazioni di istanza in Haskell
- 3. Tipo firme
- 4. Digitare la parola chiave nelle dichiarazioni di classe e istanza
- 5. Haskell tipo istanza famiglia con vincoli di tipo
- 6. possibile istanza/tipo di oggetto
- 7. Dichiarazioni di controllo in Haskell?
- 8. Uso di "Forse" di Haskell, tipo dichiarazioni [domanda per principianti]
- 9. È possibile avere sinonimi di tipo smemorato in Haskell?
- 10. Esistono firme di tipi che Haskell non è in grado di verificare?
- 11. È possibile ottenere l'errore di tipo infinito in Haskell 98?
- 12. Firme elettroniche nelle pagine Web
- 13. Tipo di dati vocale in Haskell, è possibile?
- 14. Perché non è possibile utilizzare "Membro statico" ... "nell'errore di tipo" ... ""?
- 15. Dichiarazioni di istanza di classe multiparametro
- 16. Perché gcc consente dichiarazioni extern di tipo void (non-pointer)?
- 17. Posizionamento standard di dichiarazioni tipo
- 18. Perché non esiste un tipo "elenco non vuoto" nelle librerie di base Haskell?
- 19. Istanza di classe di sollevamento in Haskell
- 20. Perché è possibile chiamare un metodo privato di un'altra istanza dello stesso tipo al di fuori di tale istanza?
- 21. Perché è possibile sovrascrivere le variabili di istanza in PHP ma non in Java?
- 22. Istanza dati Haskell per tipo di dati opaco
- 23. Haskell classi di tipo ereditare
- 24. Come è nata la convenzione di non inserire alcuno spazio bianco nelle dichiarazioni del metodo Obj-C?
- 25. Perché le parentesi significative in F dichiarazioni di tipo #
- 26. Haskell sovrapposte istanze e funzioni di tipo
- 27. confuso circa funzione di istanza di Functor in Haskell
- 28. Haskell - Variabile di tipo ambiguo, perché?
- 29. non è possibile accedere con un riferimento di istanza; qualificare con un nome di tipo invece
- 30. Non è possibile inserire UISearchBar nell'intestazione UITableView?
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. –