2

所以我坐在这里为自己编译 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 ()))

我只是想知道我是否正确诊断了问题,如果是,我该怎么做才能解决它?

4

2 回答 2

4

看起来您可能安装了两个版本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,然后重新编译任何会中断的库,这样您就有了一个干净的工具链。

于 2011-05-07T20:20:48.403 回答
1

您还可以使用以下命令隐藏其中一个包:

ghc-pkg hide containers-0.3.0.0
于 2012-01-20T12:41:23.167 回答