35

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

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

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

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

4

2 回答 2

32

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

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

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

于 2011-02-17T21:43:45.003 回答
20

Paul 的回答是正确的,但我只是想扩展将路径直接传递给编译器的想法,以获得快速简便的解决方案,主要用于运行带有runhaskellor的脚本runghc

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

因此,例如,如果您的目录结构如下:

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

你希望Module2能够 import Module1,然后Module2.hs像往常一样在里面添加你的 import 语句:

import Module1

然后当你执行Module2.hsusing时,runhaskell你会像这样运行它:

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

参考:

于 2012-11-28T15:44:03.383 回答