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