2013-05-18 14 views
7

Robię mały pakunek, który definiuje owijarki za krotki i dodaje je tworzyć instancje, jakJak utworzyć pakiet non-TH z kodu wygenerowanego przy użyciu szablonu 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 ... 

ten powtarza się od 2 do 15, więc wygląda na to zadanie dla szablonu Haskell.

Wygenerowany kod jest zawsze zgodny z Haskell 98, więc chciałbym, aby ostateczny wynik był również kompatybilny z Haskell 98. Czy można wygenerować fragment kodu za pomocą szablonu Haskell i utworzyć z niego pakiet, który nie korzysta z samego TH? (wolałbym zautomatyzowany sposób, jeśli to możliwe).

Odpowiedz

3

Istnieją narzędzia do niego:

Nota prawna: Nie próbowałem żadnego z nich osobiście.

+0

Próbowałem zeroth, ale nie kompiluje. Postaram się skontaktować z oryginalnym autorem. –

2

Zawsze można napisać program Haskell, który wyprowadza kod źródłowy Haskella jako zwykły plik tekstowy. Możesz skompilować to tak, jak każdy inny plik.

Co to nie daje, oczywiście:

  • sprawdzania składni. (Tj. Generowany kod może zawierać błędy składniowe).
  • Możliwość sprawdzenia już skompilowanego ręcznie kodu.
  • Możliwość korzystania z innych funkcji GHC, takich jak wnioskowanie o typie.
+0

Długo przed TH i syb, napisałem tak wiele programów do pisania programów, że napisałem program piszący program do pisania programów. Odczytuje kod źródłowy z pliku .rtf i umieszcza kod na każdym innym poziomie w zależności od koloru tekstu! Nie jestem pewien, czy kiedykolwiek przepuściłem go od Gofera do Haskella, ale i tak było fajnie. – AndrewC

+0

To jest opcja, tak, ale moje pytanie dotyczyło właśnie rozwiązania TH. –