【问题标题】:Haskell - Automatically using a variable from an imported moduleHaskell - 自动使用导入模块中的变量
【发布时间】:2013-01-03 19:16:57
【问题描述】:

假设我有一个名为 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 是否会这样做。 感谢您的帮助!

【问题讨论】:

    标签: templates haskell dynamic


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。你对如何用 TH 做到这一点有什么建议吗?因为我正在尝试浏览文档,但我无法找到它解释修改模块导入的地方。而且我想如果我要使用 TH,代码看起来会更复杂吧?
    • @ft_ 不允许修改模块导入。然而,它允许拼接(宏)检查编译器状态,我记得,包括可见变量的(限定)名称。所以你可能可以编写宏,给定一个变量名,它将读取所有可见变量的名称并产生像local_routes = concat [Module1.route, Module2.route.... ModuleN.route]这样的行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2016-08-15
    • 2011-07-25
    • 2023-02-04
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多