cabal 项目中允许的模块源层次结构的灵活性

Flexibility of the hierarchy of module sources allowed in cabal project

我有一个带有源码树的项目:

src/
src/A/
src/A/A.hs
src/B/
src/B/C/
src/B/C/C.hs
...

两个haskell文件将源代码分成模块:

-- File A/A.hs
module A where
...

-- File B/C/C.hs
module B.C where
...

cabal 文件包含:

other-modules: A, B.C, ...
hs-source-dirs: src/, src/A/, src/B/, src/B/C/, ...

但是虽然模块 A 很容易找到,但 cabal 抱怨 B.C:

cabal: can't find source for B/C in ...

我看不出为什么将定义模块 A 的文件放在 A/A.hs 下可以,但将 B.C 放在 B/C/C.hs 下则不行。除了将 C.hs 直接放在 B 下(我想保持一些来源分离)之外,是否有其他解决方法?

错误的原因是模块 B.C 应该在文件 B/C.hs 中定义,而不是 B/C/C.hs(即模块 B.C.C)。如果您只有一个源目录和一个源文件,就会出现此错误,这不是因为您放入了额外的部分。

此外,hs-source-dirs指令中出现的dir应该只是目录树的根目录,所以你是否需要你放入的所有部分是值得怀疑的,例如,src/B/C (这会将 src/B/C 视为另一个根....这意味着您可以在该目录中定义顶级模块。如果您确实这样做,我会认为这是一个错误)。

你可能想要做的是定义多个顶级源目录,像这样

A_src/A.hs
B_src/B/C.hs

hs-source-dirs: A_src, B_src

更好的是,我建议您使用堆栈,它允许您使用它们自己的源目录完全分离不同的模块,称为 src,以及独立的 .cabal 文件,允许每个模块之间更丰富的依赖关系。