2013-05-18 6 views
7

Sto facendo un piccolo pacchetto che definisce wrapper per le tuple e aggiunge casi loro forma, comeCome creare un pacchetto non TH dal codice generato usando Template Haskell?

newtype Tuple2 a = Tuple2 { untuple2 :: (a, a) } 
    deriving (...) 

tuple2 :: a -> a -> Tuple2 a 
tuple2 = ... 

instance Traversable Tuple2 where ... 
instance Foldable Tuple2 where ... 
instance Functor Tuple2 where ... 
instance Applicative Tuple2 where ... 

Questo ripete 2-15, in modo che appaia come un lavoro di Template Haskell.

Il codice generato è sempre compatibile con Haskell 98, quindi mi piacerebbe che anche il risultato finale fosse un pacchetto Haskell 98 compatibile. È possibile generare un pezzo di codice usando Template Haskell e creare un pacchetto che non usi TH stesso? (preferirei un modo automatico, se possibile.)

risposta

3

Ci sono strumenti per esso:

Disclaimer: Non ho provato nessuno di questi me stesso.

+0

Ho provato zeroth, ma non viene compilato. Proverò a contattare l'autore originale. –

2

È sempre possibile scrivere semplicemente un programma Haskell che emette il codice sorgente Haskell come un normale file di testo. Puoi quindi compilarlo come qualsiasi altro file.

Quello che non ti dà, ovviamente:

  • controllo della sintassi. (Ad esempio, il codice generato potrebbe contenere errori di sintassi.)
  • La possibilità di ispezionare codice scritto a mano già compilato.
  • La possibilità di utilizzare altre funzioni GHC come l'inferenza di tipo.
+0

Molto tempo prima di TH e di syb, ho scritto così tanti programmi di scrittura del programma che ho scritto un programma per scrivere programmi di scrittura. Legge il codice sorgente da un file .rtf e inserisce il codice a ogni livello diverso in base al colore del testo! Non sono sicuro di averlo portato da Gofer a Haskell, ma è stato comunque divertente. – AndrewC

+0

Questa è un'opzione, sì, ma la mia domanda è stata specificatamente richiesta per una soluzione TH. –