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

Jos*_*arl 31 haskell hunit

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

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

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

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

Pau*_*son 30

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

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

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

  • 谢谢,保罗.这非常有帮助.我当然看到了很多关于Cabal的讨论,但我不确定这是否是简单项目的最佳选择.像Linux一样,Haskell很有趣但是大多数人在500级别"解释"东西,并假设你已经拥有很多初学者没有的背景知识.我很欣赏清晰度. (5认同)

J.C*_*ski 17

保罗的答案很明显,但我只是想扩展将路径直接传递给编译器的想法,以便快速简便地解决,主要用于运行带runhaskell或的脚本runghc.

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

所以,例如,如果你有这样的目录结构:

home/
|-- user/
    |-- haskell/
        |-- Module1.hs
        |-- foo/
            |-- Module2.hs
Run Code Online (Sandbox Code Playgroud)

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

import Module1
Run Code Online (Sandbox Code Playgroud)

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

$ cd /home/user/haskell/foo
$ runhaskell -i/home/user/haskell Module2.hs
Run Code Online (Sandbox Code Playgroud)

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