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

我不确定 Template Haskell 是否会这样做。谢谢你的帮助!

4

1 回答 1

6

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

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

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

于 2013-01-03T19:37:44.413 回答