2012-01-07 52 views
2

我想做一个叫做'load'的函数,它从另一个文件中导入函数的定义。我知道如何导入模块,但在我的程序中,我希望函数的定义根据使用这个新函数“加载”哪个模块而改变。有没有办法做到这一点?有没有更好的方式来编写我的程序,这样就没有必要?导入模块作为一个函数,用字符串作为输入

我认为它的类型签名会看起来像: 负载::字符串 - > IO() 其中字符串被加载(和模块在同一个目录)模块的名称。

编辑:感谢所有的答复。大多数人都认为,这不是做我想做的最好的方式。相反,是否有办法在I/O程序中声明一个全局变量。也就是说,我需要它,如果我在类型为String - > IO()的函数中键入(函数“thing”),我仍然可以在GHCi中键入'thing'以获取赋值给它的值...任何建议?

+1

你能举一个你认为这会有用的例子吗?我有一种感觉是不可能的(或者至少是容易的),但我相信有更好的东西可以解决你的问题。我只是不确定你面临的实际问题是什么。 – 2012-01-07 06:31:15

+2

做这样的事情是...... *可能*,但是实际上你不想这么做,除非你试图写GHCi之类的东西。 – 2012-01-07 06:33:47

回答

2

几乎可以肯定有更好的方法来编写你的程序,所以这是没有必要的。不过,如果不了解更多有关您的情况的细节,很难说清楚。例如,您可以将每个模块实现的通用接口表示为数据类型,并让每个模块将该类型的值与实现一起导出。

基本上,一套已加载的模块是静态,编译时属性,所以它是没有意义的希望你的程序的行为来改变基于它的内容。你想写一个图书馆吗?您的用户可能不会明白它在做这样的邪恶魔法的进口清单:)(很可能也不是没有可能的模板哈斯克尔在这种情况下,无论如何。)


唯一的例外是,如果你试图实现一个Haskell工具(例如REPL,IDE等)或尝试插件;即Haskell源代码的动态加载模块以集成到您的Haskell程序中。首先要尝试这些应该是hint,但你可能会发现你需要更先进的东西;在这种情况下,GHC API可能是你最好的选择。 plugins曾经是这个领域的事实上的标准,但它似乎没有与GHC 7编译;你可能想看看direct-plugins,这是一个类似界面的简化实现。

mueval可能是相关的;它被设计用于在安全沙箱中执行短(单行)的Haskell代码片段,如lambdabot所使用的。

1

除非你正在构建一个Haskell IDE或类似的东西,否则你很可能不需要这个(^ 1)。

,在你做的情况下,总有hint-package,它允许你嵌入一个Haskell解释到你的程序。这允许您在运行时加载haskell模块并将字符串转换为haskell值。还有就是如何使用它here


^1一个很好的例子:如果你正在寻找一种方法,使事情多态,即改变了一些,但不是所有的在你的代码定义,你大概在寻找typeclasses

0

关于您的编辑,也许您可​​能会对IORef感兴趣。

相关问题