2012-01-07 56 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感興趣。

相關問題