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

ft_*_*ft_ 4 templates haskell dynamic

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

module Item
  ( routes ) where
routes = ["test1","test2","test3"]
Run Code Online (Sandbox Code Playgroud)

Main我的模块中:

import qualified Item as I
routes = I.routes ++ ["test4", "test5"]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能在编译时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"]
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*hid 6

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

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

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

  • 谢谢你的回答.你有什么关于如何用TH做的建议吗?因为我试图通过文档,但我无法找到解释修改模块导入的地方.而且我想如果我使用TH,代码看起来会更复杂吗? (2认同)