Erreur «Impossible de charger l'interface» lors du chargement des modules compilés dans ghci
Bonjour Haskell communauté,
Je suis nouveau sur Haskell et a couru dans un problème, quand j'ai essayé de structurer mon premier gros projet.
Voici l'exemple minimal du problème (je suis en utilisant cabale de construire).
C'est la structure de répertoire d'un module simple:
FooMod1
|- FooMod1.cabal
|- Setup.hs
|- src
|- FooMod1.hs
|- FooMod1
|- C1.hs
|- T1.hs
La source pour FooMod1.hs:
module FooMod1 (
C1(..) ,
T1(..) ,
) where
import FooMod1.C1
import FooMod1.T1
La source pour la C1.hs:
module FooMod1.C1 (
C1(..)
) where
class C1 a where
c1FooFun :: a -> IO ()
La source pour 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"
La source de la cabale fichier:
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
et la Configuration.hs:
module Main where
import Distribution.Simple
main = defaultMain
Je peux faire
cabal configure
cabal build
cabal install
sans aucun problème. Quand j'ai commencer à ghci et
import FooMod1
il charge le module et je peux voir les données des constructeurs.
Mais quand j'essaie d'obtenir le type d'une fonction par exemple
:t c1FooFun
ou de construction d'une valeur-je obtenir:
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 cochez la case' ne révèle rien.
Ce qui me manque? J'ai regardé dans le Haskell 2010 Standard (http://www.haskell.org/onlinereport/haskell2010/haskellch5.html) et je ne trouve pas l'erreur. Donc mes questions sont les
1) Pourquoi j'obtiens cette erreur?
2) Est la structuration hiérarchique des modules comme des bonnes pratiques? (à supposer nettement plus gros programmes)
Merci beaucoup d'avance!
Jules
source d'informationauteur jules
Vous devez vous connecter pour publier un commentaire.
Edit: Septembre 2016
Depuis l'origine, j'avais répondu à cette question, il est une pratique qui se développe de définir
Foo.Internal
modules qui sont encore exposés. Dans l'original de la réponse ci-dessous, j'ai suggéré à l'aide de laother-modules
champ. Une pratique qui est maintenant populaire est de définirFoo.Internal.*
modules qui sont exposées, mais pas explicitement partie de l'API pris en charge. La raison d'être de ce modèle est expliqué dans les réponses à cette question.Comme indiqué dans les commentaires de votre
.cabal
fichier est manquant leother-modules
ligne. Je pense quecabal install
puis s'installe uniquementFoodMod1
depuis qu'il a été dit à propos de.C'est une belle façon de créer des modules internes avec, par exemple, les types qui sont utilisés tout au long de votre cabale paquet que vous ne voulez pas exposer dans le paquet de l'API. Depuis le
other-modules
modules ne peuvent pas être importées de l'extérieur de votre colis, il vous permet de créer un package privé fonctionnalité.