GHC не может найти модуль в песочнице Кабала

Я использую Haskell версии 7.8.4 на (X)Ubuntu 15.10, с Cabal-Install 1.18, установленной через apt, Я не пытался вручную установить что-либо, связанное с Haskell, на эту машину. Я установил песочницу для клики, загрузил и установил модуль только для того, чтобы обнаружить, что ghc похоже, не поднимает это. ghc -v Похоже, у меня есть две версии библиотеки Кабала, которые взаимно затеняют друг друга. Как это работает?

Я начинаю с пустой директории /tmp/haskell-example

тогда я делаю cabal sandbox init,

$ cabal sandbox init
Writing a default package environment file to
/tmp/haskell-example/cabal.sandbox.config
Creating a new sandbox at /tmp/haskell-example/.cabal-sandbox

тогда я устанавливаю natural-numbers потому что я хочу использовать Data.Natural модуль в программе. Эта операция выполнена успешно.

$ cabal install natural-numbers
Resolving dependencies...
Notice: installing into a sandbox located at
/tmp/haskell-example/.cabal-sandbox
Configuring natural-numbers-0.1.2.0...
Building natural-numbers-0.1.2.0...
Installed natural-numbers-0.1.2.0

Я могу убедиться, что Data.Natural модуль действительно был установлен в песочнице клики.

$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0
 Data
libHSnatural-numbers-0.1.2.0.a
libHSnatural-numbers-0.1.2.0-ghc7.8.4.so
$ ls /tmp/haskell-example/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/natural-numbers-0.1.2.0/Data
Natural.dyn_hi
Natural.hi

тогда я создаю простой Main.hs файл, который импортирует Data.Natural но не использует его.

module Main where

import Data.Natural

main = putStrLn "Hello World"

Когда я пытаюсь ghc Main.hs Я вижу следующее:

$ ghc Main.hs 
Main.hs:3:8:
    Could not find module ‘Data.Natural’
    Use -v to see a list of the files searched for.

С включенным многословным флагом кажется, что моя клика затеняется более поздней кликой, которая, в свою очередь, затеняет предыдущую клику. Почему это происходит?

$ ghc -v Main.hs 
Glasgow Haskell Compiler, Version 7.8.4, stage 2 booted by GHC version 7.8.4
Using binary package database: /usr/lib/ghc/package.conf.d/package.cache
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209
wired-in package rts mapped to builtin_rts
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags: 
hiding package Cabal-1.18.1.5 to avoid conflict with later version Cabal-1.22.1.1
wired-in package ghc-prim mapped to ghc-prim-0.3.1.0-ec14d2f6075975a2ce9112eae431c8e1
wired-in package integer-gmp mapped to integer-gmp-0.5.1.0-de4898ebdc5ab81cedce89121ae9ac84
wired-in package base mapped to base-4.7.0.2-5ef1e7e809bc3b18d74efc783356e209
wired-in package rts mapped to builtin_rts
wired-in package template-haskell mapped to template-haskell-2.9.0.0-c1976a420ad8b9b589eee08844c59ba2
wired-in package dph-seq not found.
wired-in package dph-par not found.
*** Chasing dependencies:
Chasing modules from: *Main.hs

Main.hs:3:8:
    Could not find module ‘Data.Natural’
    Locations searched:
    Data/Natural.hs
    Data/Natural.lhs
*** Deleting temp files:
Deleting: 
*** Deleting temp dirs:
Deleting: 

1 ответ

Решение

Если вы занимаетесь хакерством вручную, вы можете перейти к ghc в папке pkg db песочницы, например:

ghc Main.hs -package-db .cabal-sandbox/x86_64-linux-ghc-7.10.2-packages.conf.d/

Однако "нормальным" способом использования песочниц всегда является компиляция с использованием cabal build (или же cabal install без параметров) вместо непосредственного запуска ghc.

  1. Бежать cabal init, отвечайте на вопросы как хотите
  2. Редактировать полученный foo.cabal файл (foo это название вашей посылки).
  3. Бежать cabal build или же cabal install - это будет работать для вас.

При редактировании файла cabal убедитесь, что ваши экспортированные модули (если это библиотека lib) указаны в списке и что ваш основной src корректен. Также убедитесь, что такие зависимости, как natural-numbers перечислены в build-depends: пункт.

Другие вопросы по тегам