2010-03-13 10 views
9

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

+0

Hehe, +1 se lo hai trovato perché speravi di poter ottenere "Test.QuickCheck.Arbitrary" per gli ADT. :) –

risposta

9

È 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.

+0

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

6

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.

6

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 :-)

+0

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

4

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.

Problemi correlati