【问题标题】:Importing files from different folders with Haskell source code使用 Haskell 源代码从不同文件夹导入文件
【发布时间】:2015-04-22 20:56:11
【问题描述】:

假设我有一些这样的文件夹:

\Code
    \Haskell
        \euler
            \P1.hs
            \P2.hs
            \P3.hs
        \fermat
            \GS
                \primes.hs

我在primes.hs 中编写了一些我想在P3.hs 中使用的函数。有没有一种方法可以将函数从 primes.hs 加载到 P3.hs 而无需复制和粘贴代码,类似于导入同一文件夹中的模块的方式?这可以用 Cabal 完成吗(我对 Haskell 还很陌生,我还没有机会熟悉 Cabal)?我知道有一些方法可以通过使用 ghci 手动加载 primes.hs 来做到这一点,但我希望能够运行 P3.hs 并让它工作。

【问题讨论】:

    标签: haskell cabal


    【解决方案1】:

    如果您创建一个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/P2.hs 中导入src/Euler/P1.hs,你需要像import Euler.P1 那样做

    您可能会在此过程中遇到一些困难,但从长远来看,使用 cabal 管理您的项目非常有用。了解基础知识,您将轻松设置项目。

    【讨论】:

      【解决方案2】:

      Haskell 期望在文件 Foo/Bar/Baz.hs 中找到模块 Foo.Bar.Baz。如果您根据模块所在的文件夹命名模块,并使用树根目录下的当前工作目录加载它们,一切都会正常。您实际上并不需要 Cabal 来完成这项工作。 (虽然随着你的程序越来越大,Cabal 当然变得非常值得学习。)

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

      module Foo.Bar.Baz where
      

      在每个源文件的顶部。因此,例如,如果您以声明开头的文件Code/Haskell/Euler/P1

      module Euler.P1 where
      

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

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

      【讨论】:

      • 回顾我的老问题,我意识到我从来没有真正接受过你的回答!你去吧,我认为这值得一点代表。
      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多