Quando si lavora con istanze derivate in Haskell, è possibile derivare funzioni per tipi arbitrari o ci si limita a particolari funzioni?Derivazione di funzioni arbitrarie in Haskell
risposta
È possibile derivare istanze delle seguenti classi in haskell 98: Eq, Ord, Enum, Ix, Bounded, Read e Show.
Utilizzando le estensioni ghc è anche possibile derivare istanze delle seguenti classi: Digitabili, Dati, Functor, Pieghevole e Attraversabile. C'è anche un'estensione ghc che consente a un newtype di derivare istanze dal suo tipo di implementazione.
Non è possibile derivare istanze di classi arbitrarie per il semplice motivo che haskell non saprebbe come generare le funzioni necessarie senza una conoscenza specifica della classe in questione.
Ma GHC può gestire alcuni casi semplici. Se dici 'newtype Bar = Bar Foo' e Foo ha un'istanza Quux, quindi GeneralizedNewtypeDeriving può derivare l'istanza Quux per Bar per te. Certo, questo è solo un semplice scartare, ma è meglio di niente. – jrockway
Sei limitato a classi particolari, in termini di ciò che il compilatore sa come derivare per te. Usando un preprocessore, o Template Haskell, è possibile programmare autonomamente nuovi meccanismi di derivazione, se si conoscono approcci generali per ottenere implementazioni di funzioni per tipi particolari.
Le altre due risposte sono corrette. Ma se hai bisogno di più, ci sono alcuni pacchetti su hackage che possono gestire di più. Mi piace molto lo Data.Derive, dal momento che puoi generare direttamente il codice sorgente (per compatibilità) o collegarlo a Template Haskell per farlo in fase di compilazione. Una vasta gamma di classi è già supportata ed è molto semplice aggiungere il supporto per il tuo. Riassunto: passo di pubblicità per una dannata bella biblioteca :-)
Ora lo riporto. All'epoca non avevo cercato di aggiungere il supporto per il mio, ma ho pensato che fosse facile. Non lo è; si tratta di ricompilare la biblioteca da quello che posso dire. Ma il supporto integrato è ancora bello e completo. – luqui
Per aggiungere alla risposta di Don: derivante funzionalità personalizzate per i tipi di dati si chiama generic programming e c'è un lot of literature su questo. Preprocessor e Template Haskell non sono le uniche soluzioni; vedere uno dei documenti di sintesi che elenca la letteratura per altre opzioni.
- 1. dati tubazioni attraverso funzioni arbitrarie in Clojure
- 2. Dichiarazione di derivazione autonoma in modello Haskell quotazione
- 3. Chiavi JSON arbitrarie con Aeson - Haskell
- 4. Derivazione dell'interfaccia in Java
- 5. Parità di funzioni in Haskell
- 6. Funzioni esterne in haskell?
- 7. Funzioni polvariadiche in Haskell
- 8. Derivazione Just-In-Time
- 9. Implementazione delle funzioni di libreria in Haskell
- 10. Derivazione di Free Monade
- 11. Composizione funzionale con funzioni multivalore in haskell?
- 12. funzioni e parametri confrontare in Haskell
- 13. Valutazione delle funzioni nulle in Haskell
- 14. Haskell: funzioni duplicate (+) e (++), mappend
- 15. Enumerazione di GADT in Haskell
- 16. Haskell LLVM - Funzioni duplicate create
- 17. Haskell ha funzioni/tuple variadiche?
- 18. Le funzioni di Haskell possono essere serializzate?
- 19. definizioni di funzioni multiple con template Haskell
- 20. Partita Elasticsearch con derivazione
- 21. Derivazione istanze con TypeFamilies
- 22. Haskell sovrapposte istanze e funzioni di tipo
- 23. Haskell coppia e le funzioni di disaccoppiamento
- 24. Trova sorgente di funzioni in Haskell (flusso di lavoro)
- 25. Derivazione di istanze predefinite utilizzando GHC.Generics
- 26. Librerie di precisione arbitrarie JVM
- 27. Le lingue esistenti consentono gli argomenti delle funzioni in aree arbitrarie in un nome funzione?
- 28. Tabelle di verità da funzioni anonime in Haskell
- 29. Dati MySQL di gruppo in intervalli temporali di dimensioni arbitrarie
- 30. Compute complesso matematica (integrazione, derivazione, ...)
Hehe, +1 se lo hai trovato perché speravi di poter ottenere "Test.QuickCheck.Arbitrary" per gli ADT. :) –