编译Haskell的多个.hs文件 - Unix

MrF*_*bio 5 unix haskell ghc ghci

我在Unix中的一个项目中创建了一些文件,它们很多,如果我想在另一个PC或文件夹中执行它,我需要将所有文件复制到那里.它们都是导入连接的.如何制作可执行的haskell程序?

我有例子:

main.hs - main where all the program executes; using,besides haskell, unix shell.
ex1.hs - basically types of data, some functions.
ex2.lhs - same as ex1.lhs but is literate with LaTeX
pic.jpg - picture to use on the pdflatex
package.sty - package needed to use some functions
Run Code Online (Sandbox Code Playgroud)

我如何进行并编译所有这些?我尝试使用ghc但总是出错:

>ghc -o MAIN main.hs ex1.hs ex2.lhs pic.jpg package.sty
Run Code Online (Sandbox Code Playgroud)

Failed to load interface for 'ex1.hs' 并且在导入ex1.hs的行中

好奇的是,如果我换进口ex1.hs进口ex2.lhs线会给EX2错误

ham*_*mar 10

  1. Haskell模块名称必须以大写字母开头,因此首先重命名ex1.hsex2.hs使用Ex1.hsEx2.hs.它们也应该从一开始module Ex1 where,否则模块名称将默认为Main,并且当模块名称与文件名不匹配时GHC将非常混淆.

  2. Import语句应该引用模块名称,而不是文件名,因此将它们更改main.hs为对应于模块名称.

    import Ex1
    import Ex2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在编译ghc --make main.hs,它应该自动找到其他模块.它将搜索具有两个.hs.lhs扩展名的模块,并正确地将后者视为有文化的Haskell文件.

对于大型项目,您应该考虑使用Cabal,这是大多数Haskell库和程序使用的构建系统.它将有助于管理依赖项和编译器选项,有点像Makefile.