2015-04-22 63 views
2

不同的文件夾導入文件說我已經制定了一些像這樣的文件夾:從Haskell的源代碼

\Code 
    \Haskell 
     \euler 
      \P1.hs 
      \P2.hs 
      \P3.hs 
     \fermat 
      \GS 
       \primes.hs 

有跡象表明,我已經寫在primes.hs一些功能,我想在P3.hs使用。有沒有一種方法可以將primes.hs中的函數加載到P3.hs中,而無需複製和粘貼代碼,這與您可以導入同一文件夾中的模塊的方式類似?這可以用Cabal完成嗎(我對Haskell相當新,我還沒有機會熟悉Cabal)?我知道有一種方法可以通過用ghci手動加載primes.hs來實現,但我想只能運行P3.hs並使其工作。

回答

3

Haskell希望在文件Foo/Bar/Baz.hs中找到模塊Foo.Bar.Baz。如果你根據它們所在的文件夾來命名你的模塊,並且將它們加載到樹的根目錄下的當前工作目錄,那麼一切都會好起來的。你實際上並不需要Cabal來完成這項工作。 (雖然隨着程序變大,它當然變得非常值得學習Cabal。)

沒有模塊聲明的Haskell文件默認被稱爲Main。要給出正確的模塊名稱,您需要執行類似於

module Foo.Bar.Baz where 

位於每個源文件的頂部。因此,舉例來說,如果啓動文件Code/Haskell/Euler/P1與申報

module Euler.P1 where 

,並開始從命令提示符指着Code/Haskell,你應該是不錯的。

請注意,Haskell模塊名稱必須以開始大寫。我相信(但我不是100%肯定)在這裏匹配文件名是不區分大小寫的。 (因爲Windows將文件名視爲不區分大小寫。)

+0

回顧我的舊問題,我意識到我從未真正接受過您的答案!你去了,這是值得我想一點代表。 – realityChemist

6

如果你創建一個cabal項目,這是非常簡單的。我建議如下所示的結構

project-name/ 
    src/ 
     Euler/ 
      P1.hs 
      P2.hs 
      P3.hs 
     Fermat/ 
      GS/ 
       Primes.hs 

然後,當你cd /path/to/project-name,運行cabal init,填寫信息,因爲它會提示你,而你只是設定。您需要做的最後一件事是設置模塊名稱。模塊的名稱應該反映在您的src文件夾中的位置,並且由於所有模塊名稱都必須以大寫字母開頭,這意味着您需要確保您的文件夾正確大寫。在這裏,您將擁有模塊Euler.P1,Euler.P2,Euler.P3Fermat.GS.Primes。根據需要在每個文件中聲明模塊名稱爲module Module.Name where,然後可以根據需要將每個文件導入到每個文件中。模塊導入總是完全合格的爲好,所以如果你想在src/Euler/P2.hs進口src/Euler/P1.hs,你需要做的是爲import Euler.P1

你可能會遇到沿途一些顛簸,但使用的陰謀來管理你的項目從長遠來看非常有用。學習基礎知識,您將輕鬆設置項目。