ghc - 制作模块层次结构

时间:2014-04-07 15:01:10

标签: haskell ghc

我试图在Haskell中第一次构建独立程序,并且无法弄清楚如何让ghc --make使用我喜欢的目录组织。就在我拥有以下树的那一刻:

readme.md
src/
  Main.hs
  Ciphers/
    Affine.hs
    Shift.hs
    Substitution.hs
  Tests/
    HCTests.hs

使用以下导入:

Main.hs:

 module Main where

 import Tests.HCTests
 import Ciphers.Affine
 import Ciphers.Shift
 import Ciphers.Substitution

HCTests.hs

module Tests.HCTests (unitTests) where

import Ciphers.Substitution
import Ciphers.Affine
import Ciphers.Shift

Affine.hs

module Affine (
  affineEnc,
  affineDec,
  ) where

Shift.hs

module Shift (
  shiftEnc,
  shiftDec
  ) where

import Affine

Substitution.hs

module Substitution (
  substitutionEnc,
  substitutionDec,
  ) where

基于此 - https://en.wikibooks.org/wiki/Haskell/Standalone_programs - 在我看来,以下命令至少应该正确处理main中的导入,虽然我不清楚HCTests中的导入是否有效(在我看来如果我正确地读了这个 - Specifying "Up The Tree" Haskell Modules - 他们应该这样做。

我在基本目录中运行的命令是:

ghc -O2 --make -i src -o crypto Main.hs

失败并显示错误:

target `src' is not a module name or a source file

修改

我还有一个问题。感谢Zeta的回答,我已经对它进行了排序,但是当我运行它时,我收到以下错误:

src/Ciphers/Substitution.hs:5:8:
    File name does not match module name:
    Saw: `Substitution'
    Expected: `Ciphers.Substitution'

所以我的假设是我通过以下方式解决这个问题:

Substitution.hs

module Ciphers.Substitution (
  substitutionEnc,
  substitutionDec,
  ) where

我的问题是如何处理Shift.hs需要导入Affine.hs,而我仍然需要Ciphers.Shift和Ciphers.Affine?

1 个答案:

答案 0 :(得分:1)

您可能无法将命令行选项-i与搜索路径分隔为空白,因为-i包含以下空格重置 search path

使用

ghc -O2 --make -isrc -o crypto Main.hs

ghc -O2 --make -i./src -o crypto Main.hs

代替。