2011-02-17 79 views
25

什麼是Haskell在另一個目錄中導入模塊的語法?什麼是Haskell語法來導入子目錄中的模塊?

我開始使用Haskell,並且想要練習用HUnit編寫簡單的函數TDD風格。不過,我無法弄清楚如何構建我的文件。 HUnit自帶的例子似乎是一個平面目錄結構。

我想我的測試和HUnit代碼在不同於我的實際代碼的文件夾中。我會很感激一個簡單的示例導入語句和關於如何構建我的文件的建議。

如果有問題,我現在使用GHCi和NotePad ++來編寫代碼。

+3

http://stackoverflow.com/questions/4949273/how-to-separate-production-and-test-code-in-haskell – sclv 2011-02-17 21:13:55

+3

http://stackoverflow.com/questions/4687387/organizational-haskell-tests – sclv 2011-02-17 21:14:12

回答

27

你實際上並沒有從Haskell源代碼中做到這一點;而是告訴編譯器在哪裏尋找。通常的方法是在.cabal文件中。有關詳細信息,請參閱the cabal user guide。你想要「hs-source-dirs」參數。

或者,您可以將路徑直接傳遞給編譯器。但是,Cabal是更好的方法。

「hs-source-dirs」參數中的每個路徑名指定模塊層次結構的根。基本上,如果您導入一個名爲「Data.Foo.Bar」的模塊,那麼編譯器會在「hs-source-dirs」給出的每個目錄中查找相對路徑名爲「Data/Foo/Bar.hs」的文件,並導入第一個一個它發現。

+4

謝謝,保羅。這非常有幫助。我當然看到很多關於Cabal的討論,但我不確定這是否是簡單項目的最佳選擇。就像Linux一樣,Haskell很有趣,但大多數人都是在500級別上「解釋」的東西,並假設你已經擁有很多初學者不具備的背景。我很欣賞清晰度。 – 2011-02-18 00:39:45

16

保羅的answer是現貨,但我只是想在直接傳遞的路徑,編譯器爲一個快速簡便的解決方案,主要用於與runhaskellrunghc運行腳本的想法擴大。

您需要做的就是將-i標誌傳遞給編譯器,並使用冒號分隔的目錄列表。然後編譯器將檢查這些目錄中導入模塊的源文件。

因此,舉例來說,如果你有像這樣的目錄結構:

home/ 
|-- user/ 
    |-- haskell/ 
     |-- Module1.hs 
     |-- foo/ 
      |-- Module2.hs 

願與您Module2能夠導入Module1,那裏面Module2.hs添加import語句像往常一樣:

import Module1 

然後當你執行Module2.hs使用runhaskell你可以這樣運行:

$ cd /home/user/haskell/foo 
$ runhaskell -i/home/user/haskell Module2.hs 

參考:http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/separate-compilation.html#search-path