2011-02-17 80 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