XMonad 键功能如何减少?

How does XMonad keys functions gets reduced?

我正在尝试了解 XMonad 配置函数的计算方式。第一个例子来自 Xmonad docs:

import qualified Data.Map as M
--

main = xmonad $ defaultConfig {
  --
  , keys          = \c -> mykeys c `M.union` keys defaultConfig c
  --
  }
where
    mykeys (XConfig {modMask = modm}) = M.fromList $
         [ ((modm , xK_x), spawn "xlock") ]

键的类型是一个函数: keys :: !(XConfig Layout -> Map (ButtonMask, KeySym) (X ())) 这里的问题是评估顺序。 keys returns Map 应用于某些 XConfig 时,然后我们得到的 Map 应该应用于 c (如果我没看错的话),但是 Map 怎么可能应用于某物?

您的描述不太正确。 keys 是一个记录字段。

如果记录类型 R 带有字段 foo :: T,则 foo 本身(用作值)的类型为 R -> T(它是一条记录访问函数)。

由于keysXConfig的一个字段,所以它的类型其实是

keys :: XConfig l -> !(XConfig Layout -> Map (ButtonMask, KeySym) (X ()))

keys defaultConfig c

我们从 defaultConfig 中提取 keys 字段。该字段中存储的值本身就是一个函数,我们将其应用于 c 以获得 Map.

Map不是函数;它是一种数据结构,并没有应用于任何事物。相反,您正在创建一个基于 defaultConfig 的新配置,其 keys 函数替换为新的匿名函数。 That 函数接受一个配置,并对其应用两个函数:你的 mikeys 和任何函数 keys defaultConfig returns。两个结果 Maps 被合并并由您的配置的 key 函数返回。

xmonad 然后使用这个新配置,其中涉及提取合并的 Map 来设置您的键绑定。