使用 Haskell 源代码从不同文件夹导入文件
Importing files from different folders with Haskell source code
假设我有一些这样布置的文件夹:
\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
并让它工作。
如果您创建一个 cabal
项目,这非常简单。我会推荐像
这样的结构
project-name/
src/
Euler/
P1.hs
P2.hs
P3.hs
Fermat/
GS/
Primes.hs
然后,当您 cd /path/to/project-name
、运行 cabal init
时,按照提示填写信息,您就可以设置了。您需要做的最后一件事是设置模块名称。模块名称应反映其在 src
文件夹中的位置,并且由于所有模块名称都必须以大写字母开头,这意味着您还需要确保文件夹的大写字母正确。在这里,您将拥有模块 Euler.P1
、Euler.P2
、Euler.P3
和 Fermat.GS.Primes
。根据需要在每个文件中将模块名称声明为 module Module.Name where
,然后您可以根据需要相互导入。模块导入也总是完全合格的,所以如果你想在 src/Euler/P2.hs
中导入 src/Euler/P1.hs
,你需要像 import Euler.P1
那样做
你可能会 运行 一路上遇到一些颠簸,但使用 cabal 来管理你的项目在长期 运行 中非常有用。学习基础知识,您将轻松设置项目。
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 将文件名视为不区分大小写。)
假设我有一些这样布置的文件夹:
\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
并让它工作。
如果您创建一个 cabal
项目,这非常简单。我会推荐像
project-name/
src/
Euler/
P1.hs
P2.hs
P3.hs
Fermat/
GS/
Primes.hs
然后,当您 cd /path/to/project-name
、运行 cabal init
时,按照提示填写信息,您就可以设置了。您需要做的最后一件事是设置模块名称。模块名称应反映其在 src
文件夹中的位置,并且由于所有模块名称都必须以大写字母开头,这意味着您还需要确保文件夹的大写字母正确。在这里,您将拥有模块 Euler.P1
、Euler.P2
、Euler.P3
和 Fermat.GS.Primes
。根据需要在每个文件中将模块名称声明为 module Module.Name where
,然后您可以根据需要相互导入。模块导入也总是完全合格的,所以如果你想在 src/Euler/P2.hs
中导入 src/Euler/P1.hs
,你需要像 import Euler.P1
你可能会 运行 一路上遇到一些颠簸,但使用 cabal 来管理你的项目在长期 运行 中非常有用。学习基础知识,您将轻松设置项目。
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 将文件名视为不区分大小写。)