#haskell #map #config #cabal #xmonad
#haskell #словарь #конфигурация #cabal #xmonad
Вопрос:
Итак, я сижу здесь, компилируя XMonad для себя, потому что мне не нравится, когда мой менеджер пакетов предоставляет версию 0.9.1, и мне нравится 0.9.2. Текущая проблема заключается в том, что компиляция самого XMonad завершается успешно, но затем я получаю странную ошибку, когда xmonad пытается проанализировать мой конфигурационный файл:
xmonad.hs:254:15:
Couldn't match expected type `containers-0.3.0.0:Data.Map.Map
(ButtonMask, KeySym) (X ())'
against inferred type `M.Map (KeyMask, KeySym) (X ())'
In the `keys' field of a record
In the first argument of `xmobar', namely
`myBaseConfig
{modMask = myModMask,
workspaces = withScreens nScreens myWorkspaces,
layoutHook = myLayoutHook nScreens, manageHook = myManageHook,
borderWidth = myBorderWidth,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor, keys = myKeys,
mouseBindings = myMouseBindings, logHook = myLogHook}'
In the second argument of `(=<<)', namely
`xmobar
(myBaseConfig
{modMask = myModMask,
workspaces = withScreens nScreens myWorkspaces,
layoutHook = myLayoutHook nScreens, manageHook = myManageHook,
borderWidth = myBorderWidth,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor, keys = myKeys,
mouseBindings = myMouseBindings, logHook = myLogHook})'
Я смог отследить причину проблемы, и она отображается в этом сеансе ghci ниже:
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
$ :m xmonad
syntax: :module [ /-] [*]M1 ... [*]Mn
$ :m XMonad
$ :t XConfig
XConfig
:: String
-> String
-> String
-> l Window
-> ManageHook
-> (Event -> X Data.Monoid.All)
-> [String]
-> KeyMask
-> KeyMask
-> (XConfig Layout
-> containers-0.3.0.0:Data.Map.Map (ButtonMask, KeySym) (X ()))
-> (XConfig Layout
-> containers-0.3.0.0:Data.Map.Map
(ButtonMask, Button) (Window -> X ()))
-> Dimension
-> X ()
-> X ()
-> Bool
-> XConfig l
$
Leaving GHCi.
Проблема, похоже, в этой строке:
-> containers-0.3.0.0:Data.Map.Map (ButtonMask, KeySym) (X ()))
Я бы подумал, что это могло бы сказать:
-> M.Map (ButtonMask, KeySym) (X ()))
Мне просто интересно, правильно ли я диагностировал проблему, и если да, то что я могу сделать, чтобы это исправить?
Комментарии:
1. Похоже, ghc пытается скомпилировать ваш код в две разные версии
container
пакета: один и тот же тип из двух разных версий — это другой тип, насколько может видеть GHC. Взгляните наghc-pkg list containers
. Тем не менее, такие проблемы часто лучше всего решать в интерактивном режиме, если ситуация становится сложной, обходите #haskell (или, возможно, #xmonad) во freenode.
Ответ №1:
Похоже, что у вас могут быть установлены две версии containers
. Вы можете подтвердить это с помощью:
$ ghc-pkg list containers
/home/dons/lib/ghc-7.0.3/package.conf.d
containers-0.4.0.0
/home/dons/.ghc/x86_64-linux-7.0.3/package.conf.d
containers-0.3.0.0
хотя это само по себе нормально, проблемы возникают, когда некоторые из ваших библиотек скомпилированы для одной версии, а некоторые — для другой. Когда эти библиотеки, в свою очередь, объединяются, например, с помощью xmonad, вы получаете ошибки типа такого рода — проблема с зависимостью diamond.
Решение состоит в том, чтобы удалить одну из версий containers
и перекомпилировать все библиотеки, которые затем ломаются, чтобы у вас был чистый набор инструментов.
Комментарии:
1. Итак, я просмотрел и уничтожил всю свою базу данных пакетов и перестроил все с нуля, включая обнаружение ошибки в зависимостях пакетов xmobar-0.13 при попытке использования libmpd-0.6, и я рад сообщить, что теперь все работает.
Ответ №2:
Вы также могли бы скрыть один из этих пакетов с:
ghc-pkg hide containers-0.3.0.0