2013-01-03 44 views
4

比方说,我有一个名为Item模块,包含:哈斯克尔 - 自动使用变量从导入模块

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

而且Main模块中我有:

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

我在想,如果有可能在编译时,使ghc动态地遍历所有导入的模块,并且如果它们导出一个名为routes的变量,则将它附加到Main模块中的routes变量。所以基本上是这样的:

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"] 

,并在编译时,最终的结果将是routes = I.routes ++ U.routes ++ ["test4","test5"]

我不知道,如果模板哈斯克尔做这样的事情。 感谢您的帮助!

回答

6

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

TH允许您向编译器询问问题,例如“模块X是否导出了名为Y的东西?”它允许您自动生成代码以将所有路线附加在一起。

另一种方法是编写一个Haskell程序来读取Haskell源代码并输出一个包含主模块的文本文件。除非你所有的模块都以特定的方式定义了routes(例如,如果它存在,总是在第5行),否则这是非常棘手的。 TH可能会更容易。

+2

感谢您的回答。你有什么建议如何与TH做到这一点?因为我试图通过文档,但我无法找到解释修改模块导入的地方。而且我想如果我使用TH,代码看起来会更复杂一点吗? –

+1

@ft_它不允许修改模块导入。但是,我记得它允许拼接(宏)检查编译器状态,包括可见变量的(限定)名称。所以你可能会写宏,即给定一个变量名,将会读取所有可见变量的名字,并产生像'local_routes = concat [Module1.route,Module2.route .... ModuleN.route]这样的行' – permeakra