Haskell - 自动使用导入模块中的变量

时间:2013-01-03 19:16:57

标签: templates haskell dynamic

假设我有一个名为Item的模块,其中包含:

module Item
  ( routes ) where
routes = ["test1","test2","test3"]

Main模块中我有:

import qualified Item as I
routes = I.routes ++ ["test4", "test5"]

我想知道是否有可能在编译时,make ghc动态浏览所有导入的模块,如果它们导出名为routes的变量,则将其附加到{{1}中的routes变量模块。所以基本上是这样的:

Main

编译时,最终结果为import qualified Item as I import qualified User as U --this one exports routes also import qualified NoRoutes as NR --this one doesn't have any routes routes = ["test4","test5"]

我不确定模板Haskell是否做了这样的事情。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:6)

模板Haskell可能是最简单的方法。

TH允许您向编译器询问类似"模块X是否导出名为Y的内容?"它允许您自动生成代码以将所有路由附加在一起。

另一种方法是编写一个Haskell程序,该程序读取您的Haskell源代码并输出包含Main模块的文本文件。除非您的所有模块以相当具体的方式定义routes(例如,如果存在,则总是在第5行),这非常棘手。 TH可能会容易得多。