Haskell ';无法加载接口';在ghci中加载编译模块时出错

Haskell ';无法加载接口';在ghci中加载编译模块时出错,haskell,module,ghc,Haskell,Module,Ghc,哈斯克尔社区你好 我是Haskell的新手,在尝试构建第一个更大的项目时遇到了一个问题 下面是这个问题的一个最小的例子(我正在使用阴谋集团来构建) 这是一个简单模块的目录结构: FooMod1 |- FooMod1.cabal |- Setup.hs |- src |- FooMod1.hs |- FooMod1 |- C1.hs |- T1.hs FooMod1.hs的来源: module FooMod1 ( C1(..) , T1(..) , ) w

哈斯克尔社区你好

我是Haskell的新手,在尝试构建第一个更大的项目时遇到了一个问题

下面是这个问题的一个最小的例子(我正在使用阴谋集团来构建)

这是一个简单模块的目录结构:

FooMod1
|- FooMod1.cabal
|- Setup.hs
|- src
  |- FooMod1.hs
  |- FooMod1
    |- C1.hs
    |- T1.hs
FooMod1.hs的来源:

module FooMod1 (
    C1(..) ,
    T1(..) ,
) where 

import FooMod1.C1
import FooMod1.T1
C1.hs的来源:

module FooMod1.C1 (
    C1(..)
) where

class C1 a where
    c1FooFun :: a -> IO ()
T1.hs的来源:

module FooMod1.T1 (
    T1(..)
) where

import FooMod1.C1

data T1 = T1 deriving(Show)

instance C1 T1 where
    c1FooFun T1 = putStrLn "c1FooFun from T1"
阴谋集团文件的来源:

Name:                      FooMod1
Version:                   0.0.1
Cabal-version:             >=1.10
Build-type:                Simple

library 
  build-depends:           base >= 4 && < 5
  if impl(ghc >= 7.0.0)
     default-language:     Haskell2010
  ghc-options:             -Wall
  exposed-modules:         FooMod1

  ghc-options:             -Wall -rtsopts
  hs-source-dirs:          src, src/FooMod1
  default-language:        Haskell2010
我能行

cabal configure
cabal build
cabal install
没有任何问题。当我启动ghci和

import FooMod1
它加载模块,我可以看到数据构造函数。 但是当我尝试获取函数的类型时,例如

:t c1FooFun
或者构造一个我得到的值:

Failed to load interface for `FooMod1.C1'
There are files missing in the `FooMod1-0.0.1' package,
try running 'ghc-pkg check'.
Use -v to see a list of the files searched for.
In the expression: c1FooFun
“ghc包装检查”未显示任何内容

我错过了什么?我在Haskell 2010标准()中查找了它,但找不到错误。所以我的问题是

1) 为什么我会犯这个错误

2) 构建这样的分层模块是一种良好的做法吗?(假设有相当大的程序)

非常感谢

朱尔斯编辑:2016年9月

自从我最初回答这个问题以来,定义仍然公开的
Foo.Internal
模块的做法越来越多。在下面的原始答案中,我建议使用
其他模块
字段。现在流行的一种做法是定义
Foo.Internal.*
模块,这些模块是公开的,但明确不是受支持的API的一部分。该模式的合理性在对的回答中进行了解释


如注释中所述,您的
.cabal
文件缺少
其他模块
行。我认为
cabal安装
然后只安装
FoodMod1
,因为这就是它被告知的全部内容


这是一种创建内部模块的好方法,例如,在整个cabal包中使用的类型,您不想在包API中公开这些类型。由于
其他模块
模块无法从软件包外部导入,因此允许您创建软件包专用功能。

我认为您的cabal文件缺少
其他模块:
行。您只告诉了它关于
FooMod1
模块的信息。我不知道为什么这不是一个编译错误。@安德鲁:非常感谢,这就是问题所在。。。你能把这个解决方案作为答案转寄给我吗?
Failed to load interface for `FooMod1.C1'
There are files missing in the `FooMod1-0.0.1' package,
try running 'ghc-pkg check'.
Use -v to see a list of the files searched for.
In the expression: c1FooFun