Ошибка компиляции XMonad с использованием неверного Data.Map

Итак, я сижу здесь, компилирую 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 ()))

Мне просто интересно, правильно ли я диагностировал проблему, и если да, то что я могу сделать, чтобы ее исправить?


person Robert Massaioli    schedule 07.05.2011    source источник
comment
Похоже, ghc пытается скомпилировать ваш код в две разные версии пакета container: один и тот же тип из двух разных версий — это другой тип, насколько может видеть GHC. Посмотрите на ghc-pkg list containers. Тем не менее, такие проблемы часто лучше всего решать в интерактивном режиме, используйте #haskell (или, возможно, #xmonad) на freenode, если что-то пойдет не так.   -  person barsoap    schedule 07.05.2011


Ответы (2)


Похоже, у вас могут быть установлены две версии 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 вы получаете ошибки типа такого рода — проблема зависимости от алмаза.

Решение состоит в том, чтобы удалить одну из версий containers и перекомпилировать любые библиотеки, которые затем сломаются, чтобы у вас был чистый набор инструментов.

person Don Stewart    schedule 07.05.2011
comment
Итак, я прошел через всю свою базу данных пакетов и перестроил все с нуля, включая обнаружение ошибки в зависимостях пакетов xmobar-0.13, когда он пытается использовать libmpd-0.6, и я рад сообщить, что теперь все это работает. - person Robert Massaioli; 09.05.2011

Вы также можете скрыть один из этих пакетов с помощью:

ghc-pkg hide containers-0.3.0.0
person odi    schedule 20.01.2012