所以我坐在这里为自己编译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 ()))
我只是想知道我是否正确诊断出问题,如果是,我该怎么做才能解决问题?
答案 0 :(得分: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,您会收到此类错误 - the diamond dependency problem.
解决方案是删除containers
的一个版本,然后重新编译然后中断的任何库,这样你就有了一个干净的工具链。
答案 1 :(得分:1)
你也可以用以下方法隐藏其中一个包:
ghc-pkg hide containers-0.3.0.0