在子目录中导入模块的Haskell语法是什么?

时间:2011-02-17 21:09:18

标签: haskell hunit

Haskell在另一个目录中导入模块的语法是什么?

我开始使用Haskell并希望练习使用HUnit编写简单的函数TDD样式。不过,我无法弄清楚如何构建我的文件。 HUnit附带的示例似乎是一个平面目录结构。

我想将测试和HUnit代码放在与实际代码不同的文件夹中。我很欣赏一个快速的示例导入语句和一个关于如何构建我的文件的建议。

如果重要,我现在正在使用GHCi和NotePad ++进行编码。

2 个答案:

答案 0 :(得分:29)

你实际上并没有从Haskell源代码中做到这一点;相反,你告诉编译器在哪里看。通常的方法是在.cabal文件中。有关详细信息,请参阅the cabal user guide。你想要“hs-source-dirs”参数。

或者,您可以将路径直接传递给编译器。然而,Cabal是更好的方法。

“hs-source-dirs”参数中的每个路径名都指定模块层次结构的根。基本上,如果你导入一个名为“Data.Foo.Bar”的模块,那么编译器会在“hs-source-dirs”给出的每个目录中查找一个相对路径名为“Data / Foo / Bar.hs”的文件并导入第一个一找到它。

答案 1 :(得分:16)

Paul的answer很有意思,但我只想扩展将路径直接传递给编译器的想法,以便快速简便地解决问题,主要是为了运行带有runhaskell或{{的脚本1}}。

您需要做的就是使用以冒号分隔的目录列表将runghc标志传递给编译器。然后,编译器将检查这些目录中是否有导入模块的源文件。

因此,例如,如果你有这样的目录结构:

-i

您希望home/ |-- user/ |-- haskell/ |-- Module1.hs |-- foo/ |-- Module2.hs 能够导入Module2,然后在Module1内添加您的导入语句:

Module2.hs

然后当您使用import Module1 执行Module2.hs时,您可以像这样运行它:

runhaskell

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