使用Haskell源代码从不同文件夹导入文件

时间:2015-04-22 20:56:12

标签: haskell cabal

说我有一些像这样的文件夹:

primes.hs

我希望在P3.hs中使用primes.hs中编写的一些功能。有没有办法将函数从P3.hs加载到primes.hs而不只是复制和粘贴代码,类似于导入同一文件夹中的模块的方式?这可以用Cabal完成(我对Haskell来说相当新,我还没有机会熟悉Cabal)?我知道有一些方法可以通过手动加载P3.hs ghci来实现,但我希望能够运行{{1}}并使其正常工作。

2 个答案:

答案 0 :(得分: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.P1Euler.P2Euler.P3Fermat.GS.Primes。根据需要在每个文件中声明模块名称为module Module.Name where,然后您可以根据需要相互导入。模块导入也始终是完全限定的,因此如果要在src/Euler/P1.hs中导入src/Euler/P2.hs,则需要将其作为import Euler.P1

进行导入

你可能会遇到一些障碍,但从长远来看,使用cabal来管理你的项目是非常有用的。了解基础知识,您将轻松设置项目。

答案 1 :(得分:4)

Haskell希望在文件Foo.Bar.Baz中找到模块Foo/Bar/Baz.hs。如果你根据它们所在的文件夹命名模块,并在树的根目录下加载当前的工作目录,那么一切都应该没问题。你实际上并不需要Cabal才能做到这一点。 (虽然随着你的课程变得越来越大,它当然值得学习Cabal。)

没有模块声明的Haskell文件默认被称为Main。要提供正确的模块名称,您需要执行类似

的操作
module Foo.Bar.Baz where

位于每个源文件的顶部。因此,例如,如果您使用声明

启动文件Code/Haskell/Euler/P1
module Euler.P1 where

从指向Code/Haskell的命令提示符开始,你应该很好。

请注意,Haskell模块名称​​必须以大写字母开头。我相信(但我不是100%确定)与文​​件名匹配在这里不区分大小写。 (因为Windows将文件名视为不区分大小写。)