2017-10-19 6 views
0

J'essaie de charger mon fichier .hs mais quand je import Data.Numbers.CReal, il me donne l'erreur Failed to load interface for 'Data.Numbers.CReal'. J'ai couru cabal install numbers et si je cabal list --installed le nombre pkg apparaît, mais si je ghc-pkg list il ne fait pas (aussi si je ghc-pkg check il donne beaucoup d'avertissements d'haddock). Est-ce lié à mon fichier de non-chargement? Comment puis-je resoudre ceci?En utilisant ghc-pkg liste et cabal list --installed donner différentes listes

Ps. Je sais comment importer des paquets, mais je ne suis pas sûr d'importer celui-ci correctement.

Merci et désolé si je ne me suis pas expliqué correctement.

Répondre

1

Deux hypothèses viennent à l'esprit:

  1. cabal est le choix d'une version différente de ghc et son assistant toolsuite que votre shell est. Vous pouvez vérifier cette anomalie en exécutant ces deux commandes:

    cabal exec -- ghc --version 
    ghc --version 
    

    Est-ce qu'ils disent la même chose? Si oui, rejeter cette hypothèse. Sinon, vous devriez décider si vous préférez le choix de la coquille ou le choix de la cabale (je vous recommande de préférer le choix de votre coquille).

    Si vous préférez mieux utiliser cabal, vous pouvez utiliser une version spécifique de GHC (et d'autres outils GHC) en ajoutant -<version> à la commande; par exemple. essayez ghc-pkg-7.10.3 list pour voir ce qui se trouve dans la base de données de packages pour la version 7.10.3 ou ghci-7.10.3 pour exécuter une version spécifique de REPL. Vous pouvez rendre ces changements permanents en ajoutant des liens symboliques ou similaires à votre PATH.

    Si vous aimez mieux le choix de votre coque, vous pouvez demander cabal d'utiliser cette version avec cabal configure -w ghc; ou si vous êtes inquiet que cabal et votre shell résoudra différemment ghc, vous pouvez demander une version spécifique avec cabal configure -w ghc-7.10.3 ou similaire.

  2. Votre shell est d'accord avec cabal sur la version de GHC à utiliser, mais vous êtes dans un sandbox cabal. cabal list --installed vous dit ce qui est installé dans le bac à sable, mais ghc-pkg list vous dit ce qui est installé dans votre base de données de paquet utilisateur. Vous pouvez vérifier les différences entre ces deux commandes:

    cabal exec -- ghc-pkg list numbers 
    ghc-pkg list numbers 
    

    (Si vous avez une cabale Newish - pas sûr quelle version est apparue dans cette - vous pouvez également essayer cabal hc-pkg list au lieu de cabal exec -- ghc-pkg list Ceci est susceptible d'être. plus de manière compatible avec l'avant, donc une bonne habitude à développer.)

    Si ceux-ci impriment les mêmes choses, rejeter cette hypothèse. Sinon, vous devriez décider si vous voulez continuer à utiliser un bac à sable (je recommande de continuer à utiliser un bac à sable).

    Si vous souhaitez arrêter d'utiliser un bac à sable, vous pouvez passer de --ignore-sandbox à cabal. Pour rendre cela permanent, regardez dans le fichier cabal.sandbox.config, qui contiendra un pointeur vers le sandbox réel (généralement .cabal.sandbox). Supprimez la configuration et le bac à sable. Vous pouvez également ignorer globalement les sandbox en ajoutant ignore-sandbox: True à votre ~/.cabal/config, mais je recommande fortement de ne pas le faire.

    Si vous souhaitez conserver le bac à sable, vous devez utiliser cabal exec pour tous vos besoins en outils GHC afin de vous assurer que la base de données de paquetage correcte est sélectionnée. Par exemple, essayez cabal exec ghci pour exécuter le REPL avec l'accès à la base de données de package sandbox.

Ces hypothèses ne sont pas mutuellement exclusives: deux peut se produire. Dans ce cas, je recommande vivement de choisir la solution finale ("utiliser cabal exec pour toutes les exécutions GHC toolsuite"), car elle gère les deux problèmes de manière transparente: les commandes GHC toolsuite standard seront réécrites pour faire référence aux versions explicitement versionnées (eg cabal exec ghc va réellement exécuter ghc-7.10.3) et l'environnement sera configuré pour pointer vers la base de données de paquets correcte.

0

La réponse à cette

Vous pouvez vérifier cet écart en exécutant ces deux commandes:

exec cabale - GHC --version GHC --version

Est-ce qu'ils disent la même chose?

était oui. Je ne me souviens pas de la deuxième option, mais j'ai réussi à le résoudre moi-même. Ce que j'ai spécifiquement fait était:

  1. exécutez la commande "rm -rf .cabal" (sans commmas) pour supprimer la configuration de cabale.
  2. run "rm -rf .cabal-bac à sable"
  3. run "rm -rf .ghc"
  4. cabale cabale nouvelle construction (pas sûr si cela a aidé ou non)
  5. En mode admin (sudo) J'ai édité le fichier de configuration de cabal et ai changé Ignore Sandbox en Vrai ->cela me donnerait-il des problèmes à l'avenir? devrais-je le changer en faux? s'il vous plaît répondre
  6. Had supprimer un cabal.sandbox.config qui donnait des ennuis
  7. cabale installer cabale installer
  8. mise à jour cabale

Maintenant la commande liste GHC-pkg et la liste cabale --installed show mes deux paquets installés, et ils fonctionnent sans problèmes.

Ps. J'ai donné des informations détaillées sur le processus au cas où quelqu'un en aurait besoin à l'avenir. Toujours pas sûr de ce qui a causé cette cabale et ghc n'a pas montré les mêmes paquets.

+0

Remarque: N'effacez pas accidentellement '.cabal/config'. – sapanoia

+0

Je considère cette réponse comme "l'option nucléaire". Je recommande fortement aux futurs lecteurs d'essayer d'abord des solutions plus douces; par exemple. Si 'cabal' a choisi une version de GHC différente de celle voulue, vous pouvez utiliser' cabal configure' pour sélectionner une autre version (comme dans 'cabal configure -w ghc-7.10.3'). Je vais modifier ma réponse pour inclure des commentaires sur cette solution. Supprimer manuellement les sandbox cabal est correct (actuellement 'cabal' n'a pas le moyen de les supprimer de manière non-manuelle), mais vous devez comprendre pourquoi le sandbox existe en premier et être sûr de ne pas le vouloir ... –

+0

Oh, et j'ai mal lu; vu les détails ici, je soupçonne fortement mon autre hypothèse proposée ("vous êtes dans un bac à sable cabal, et' cabal list --installed "vous dit ce qui est installé dans le bac à sable, mais' ghc-pkg list' vous dit ce qui est installé dans votre base de données de paquet utilisateur ") était la bonne. 'cabal configure' ne va pas aider avec cela, mais je présente deux solutions plus douces à ce problème dans ma réponse. –