2016-10-12 7 views
6

Я работаю над заданием «римские цифры» с трека Haskell по тренировкам и следил за их instructions to installing stack. Я работаю над блоком Fedora 24.Как добавить пакет контейнеров в мой .cabal файл (не перезаписывая стек во время компиляции)?

До тех пор, пока я работал с модулями Haskell с базы, у меня не было проблемы. Теперь я пытаюсь импортировать модуль Data.Map. Он отлично работает с помощью команды GHCi строку:

$ ghci 
GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> import Data.Map 
Prelude Data.Map> 

Однако, когда я пытаюсь импортировать его из внутри моего Src файла с помощью команды:

import qualified Data.Map as M (foldlWithKey, fromList) 

Я бегу в проблемы, когда я пытаюсь запустить тест:

$ stack test 
roman-numerals-0.0.0: build (lib + test) 
Preprocessing library roman-numerals-0.0.0... 
[2 of 2] Compiling Roman   (...) 
(...) /roman-numerals/src/Roman.hs:3:1: error: 
    Failed to load interface for ‘Data.Map’ 
    It is a member of the hidden package ‘containers-0.5.7.1’. 
    Perhaps you need to add ‘containers’ to the build-depends in your .cabal file. 
    Use -v to see a list of the files searched for. 
Progress: 1/2 
(...) 

Я гугл проблемы и нашел простое решение в the Cabal FAQ at haskell.org:

Что вам нужно сделать, так это добавить контейнеры в сборку - зависит от вашего файла .cabal.

Я предполагаю, что они означают файл roman-numbersals.cabal, который находится в моем рабочем каталоге. Содержание являются:

-- This file has been generated from package.yaml by hpack version 0.14.0. 
-- 
-- see: https://github.com/sol/hpack 

name:   roman-numerals 
version:  0.0.0 
build-type:  Simple 
cabal-version: >= 1.10 

library 
    hs-source-dirs: 
     src 
    build-depends: 
     base 
    exposed-modules: 
     Roman 
    other-modules: 
     Paths_roman_numerals 
    default-language: Haskell2010 

test-suite test 
    type: exitcode-stdio-1.0 
    main-is: Tests.hs 
    hs-source-dirs: 
     test 
    build-depends: 
     base 
    , roman-numerals 
    , hspec 
    default-language: Haskell2010 

Я пытался добавить «контейнеры» для сборки, зависит либо и как «библиотека» и «тест-люкс» секций, но когда я бегу

$ stack test 

ошибка сохраняется, а файл .cabal возвращается к тому же содержимому, показанного выше.

Любые указатели? Очень признателен!

ответ

9

Это намекает на проблему:

-- This file has been generated from package.yaml by hpack version 0.14.0. 
-- 
-- see: https://github.com/sol/hpack 

hpack является альтернативой, YAML-формат на основе спецификации для Haskell пакетов, которые могут быть использованы вместо традиционного формата междусобойчик. Затем программу hpack можно использовать для преобразования спецификации из формата hpack в формат cabal, чтобы она могла интегрироваться с остальной частью инструментальной цепочки Haskell.

Некоторое время назад в стек было добавлено basic support for hpack. Он проверяет файл с именем package.yaml в текущем каталоге, который является стандартным именем для спецификаций пакета hpack, и если он существует, он запускает hpack, чтобы преобразовать его в файл cabal, а затем продолжает строить как обычно. Это то, что попирает ваш файл .cabal.

Чтобы решить эту проблему, либо:

  • Изменить package.yaml вместо roman-numerals.cabal для достижения того же эффекта.
  • Удалить package.yaml и продолжить работать непосредственно с roman-numerals.cabal.

Синтаксис для добавления зависимостей в формате hpack является:

dependencies: 
    - base 
    - containers 
+0

Спасибо! Это сработало. – ktiu

 Смежные вопросы

  • Нет связанных вопросов^_^