如何使用Template Haskell生成的代码创建非TH包?

时间:2013-05-18 06:54:16

标签: haskell tuples 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,所以它看起来像是模板Haskell的工作。

生成的代码总是与Haskell 98兼容,所以我希望最终结果也是Haskell 98兼容包。 是否可以使用Template Haskell生成一段代码并从中创建一个不使用TH本身的包?(如果可能的话,我更喜欢自动化方式。)

2 个答案:

答案 0 :(得分:4)

有适合​​它的工具:

免责声明:我自己没有尝试过这些。

答案 1 :(得分:2)

总是可以编写一个Haskell程序,将Haskell源代码作为普通文本文件输出。然后,您可以像任何其他文件一样编译它。

当然,这不会给你带来什么:

  • 语法检查。 (即,您生成的代码可能包含语法错误。)
  • 检查已编译的手写代码的能力。
  • 使用类型推断等其他GHC功能的能力。