Как создать пакет, отличный от TH, из кода, сгенерированного с помощью 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 ...

Это повторяется от 2 до 15, так что это похоже на задание для Template Haskell.

Сгенерированный код всегда совместим с Haskell 98, поэтому я хотел бы, чтобы конечный результат был также совместимым с Haskell 98 пакетом. Можно ли сгенерировать фрагмент кода с помощью Template Haskell и сделать из него пакет, который не использует сам TH? (я бы предпочел автоматизированный способ, если это возможно.)


person Petr    schedule 18.05.2013    source источник


Ответы (2)


Для этого есть инструменты:

Отказ от ответственности: я не пробовал ни один из них сам.

person Joachim Breitner    schedule 18.05.2013
comment
Пробовал нулевой, но не компилируется. Я постараюсь связаться с первоначальным автором. - person Petr; 20.05.2013

Всегда можно просто написать программу на Haskell, которая выводит исходный код на Haskell в виде обычного текстового файла. Затем вы можете скомпилировать его, как и любой другой файл.

Чего это вам не дает, конечно:

  • Проверка синтаксиса. (То есть сгенерированный вами код может содержать синтаксические ошибки.)
  • Возможность проверки уже скомпилированного рукописного кода.
  • Возможность использовать другие функции GHC, такие как определение типа.
person MathematicalOrchid    schedule 18.05.2013
comment
Задолго до TH и syb я написал так много программ для написания программ, что написал программу для написания программ. Он считывает исходный код из файла .rtf и размещает код на каждом уровне в зависимости от цвета текста! Я не уверен, что когда-либо портировал его с Gofer на Haskell, но в любом случае это было весело. - person AndrewC; 19.05.2013
comment
Это вариант, да, но мой вопрос задан специально для решения TH. - person Petr; 21.05.2013