尝试在Xmonad中使用ManagerDocks时出现模糊的“无法匹配预期的类型”错误

时间:2019-04-19 18:09:56

标签: haskell cabal cabal-install xmonad

我正在尝试将docks命令添加到我的.xmonad配置中,但是添加它会导致某种令人困惑的类型错误:

Error detected while loading xmonad configuration file: /home/dan/.xmonad/xmonad.hs

xmonad.hs:11:11: error:
    • Couldn't match expected type ‘XConfig l0’
                  with actual type ‘xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Core.XConfig
                                      (xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Choose
                                         xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Tall
                                         (xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Choose
                                            (xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Mirror
                                               xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Tall)
                                            xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Layout.Full))’
      NB: ‘xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795:XMonad.Core.XConfig’
            is defined in ‘XMonad.Core’
                in package ‘xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795’
          ‘XConfig’
            is defined in ‘XMonad.Core’
                in package ‘xmonad-0.14.2@xmonad-0.14.2-8c611bf8742b1b94190ab2fa494cb2a1cd3f8666db2ba536c81ae848ea043a6b’
    • In the first argument of ‘xmonad’, namely ‘(docks def)’
      In the expression: xmonad (docks def)
      In an equation for ‘main’: main = xmonad (docks def)

Please check the file for errors.

这是我的配置文件:

import           XMonad
import           XMonad.Hooks.ManageDocks (docks)

main :: IO ()
main =
  xmonad (docks def)

我不确定这里到底出了什么问题,并认为也许我在安装过程中搞砸了..尽管我不确定如何解决问题。


ghc-pkg list xmonad的输出:

/opt/ghc/8.0.2/lib/ghc-8.0.2/package.conf.d
    (no packages)
/home/dan/.ghc/x86_64-linux-8.0.2/package.conf.d
    (no packages)

2 个答案:

答案 0 :(得分:0)

此错误表明,您的构建某种程度上依赖于两个不同的xmonad Cabal软件包。编译任何内容时,GHC都会与类型名称本身(例如Prelude.Maybe)一起存储它来自的(对于Preludebase) 。您可以使用ghc-pkg list查看GHC可用的软件包列表。

该错误消息表明docksXMonad.Core.XConfig包中产生了一个类型为xmonad-0.14.2@xmonad-0.14.2-50ceb56c2be27c58b715ff1418342ea50324c61ceef6f33afc6bf382abd08795的值(为简便起见,我将其称为“ xmonad 50”)。请注意,docks本身是xmonad-contrib包的一部分。但是,xmonad期望的值是XMonad.Core.XConfig包中的xmonad-0.14.2@xmonad-0.14.2-8c611bf8742b1b94190ab2fa494cb2a1cd3f8666db2ba536c81ae848ea043a6b类型的(进一步的“ xmonad 8”)。

这是构建的依赖关系图:

  • 您的构建
    • xmonad 8
    • xmonad-contrib
      • xmonad 50

对此的猜测:

  • 您以某种方式从操作系统存储库中或通过手动编译安装了xmonad-contrib和/或xmonad。您的软件包数据库现在包含xmonad 50和xmonad-contrib
  • 您再次安装了xmonad,这创建了一个不同的软件包版本(xmonad 8)。但是,您仍然可以使用xmonad-contrib,它是针对xmonad 50编译的早期安装版本。

此问题被称为Cabal Hellanother explanation)。

下一步可以做什么:

  • 检查您是否以某种方式没有安装两个GHC版本。 /opt/ghc是非标准的安装路径,发行版的标准路径中可能还有其他版本。
  • 调查两个xmonad库和一个xmonad-contrib的安装位置。 ghc-pkg listghc-pkg list --user可能会有所帮助,或者失败,请使用strace or similar tools来查看xmonad在重新编译时的外观。
  • 删除并重新安装软件包,以使您只有一个xmonad和一个xmonad-contrib。如果在上一步中找到了其他版本,则可以尝试ghc-pkg unregister,如果没有,请删除完整的软​​件包数据库,然后再次(一起!)重新安装所需的软件包。

将来,请尝试不要从其他来源安装与XMonad相关的软件包,如果您要使用新型Cabal构建,请查看专门关于新型构建和XMonad的教程(不幸的是,我没有使用该教程)不能提出任何建议。)

答案 1 :(得分:-1)

您的主要功能必须类似于

main = do
  xmonad $ docks def