[英]'Failed to load interface' error when loading compiled modules in ghci
您好Haskell社區,
當我嘗試構建我的第一個更大的項目時,我是Haskell的新手並遇到了一個問題。
這是問題的最小例子(我正在使用cabal來構建)。
這是一個簡單模塊的目錄結構:
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"
cabal文件的來源:
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
和Setup.hs:
module Main where
import Distribution.Simple
main = defaultMain
我可以
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-pkg check'什么也沒透露。
我錯過了什么? 我在Haskell 2010標准( http://www.haskell.org/onlinereport/haskell2010/haskellch5.html )中查找了它,我找不到錯誤。 所以我的問題是
1)為什么我收到此錯誤?
2)構建像這樣的良好實踐的分層模塊嗎? (假設相當大的程序)
提前謝謝了!
儒勒
編輯:2016年9月
自從我最初回答這個問題以來,有一種越來越多的定義Foo.Internal
做法。 Foo.Internal
模塊仍然暴露出來。 在下面的原始答案中,我建議使用other-modules
字段。 現在流行的做法是定義Foo.Internal.*
模塊,這些模塊已公開但明確不屬於受支持的API。 這個模式的理性在這個問題的答案中得到了解釋。
如評論中所述,您的.cabal
文件缺少other-modules
行。 我認為cabal install
只安裝了FoodMod1
因為它已被告知。
這是一種創建內部模塊的好方法,例如,您不希望在包API中公開的整個cabal包中使用的類型。 由於無法從包外部導入other-modules
模塊,因此您可以創建包私有功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.