2015-12-07 2 views
5

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

Я начинаю с пустым каталогом /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: 
+0

Вы обновили свой .cabal файл? – Sigrlami

+0

@ Сигрлами, боюсь, я не понимаю. У меня есть каталог под названием '$ HOME/.cabal' и'/tmp/haskell-example/.cabal-sandbox', но не файл '.cabal'. Что мне нужно сделать, чтобы обновить его? –

+0

Когда вы используете команду 'cabal init' внутри вашего проекта, создается файл' foo.cabal', который описывает все необходимые зависимости, и вам нужно добавить их вручную. Предположим, что ваше имя проекта 'foo'.Например, https://github.com/sigrlami/pollock/blob/master/pollock.cabal – Sigrlami

ответ

6

Если вы в ручное хакерство, вы можете перейти к GHC местоположения упака дб песочницы, такие как:

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

Однако «нормальный» способ использования песочницы, чтобы всегда компилировать с помощью cabal build (или cabal install без параметров), а не прямое управление ghc.

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

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

+1

Подождите секунду. Я думаю, что я думал о «кабале» совершенно неправильно. Я ожидал, что песочница будет работать как виртуальная или npm-среда и изменит поведение ghc, но похоже, что единственное сходство состоит в том, что она перенаправляет, где 'cabal install' устанавливает вещи. Теперь это имеет смысл. –