【问题标题】:How does XMonad keys functions gets reduced?XMonad 按键功能如何减少?
【发布时间】:2018-12-22 22:53:47
【问题描述】:

我试图了解如何评估 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 应用于某些XConfig 时返回Map,然后我们得到的Map 应该应用于c(如果我没记错的话),但是如何将Map 应用于某些东西呢?

【问题讨论】:

  • 简单:keys 的类型不正确。

标签: haskell xmonad


【解决方案1】:

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

如果您有一个记录类型 R 和一个字段 foo :: T,那么 foo 本身(用作值)具有类型 R -> T(它是一个记录访问器函数)。

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

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

keys defaultConfig c

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

【讨论】:

  • 谢谢,data XConfig 源代码让我很清楚 ;-)
【解决方案2】:

Map 不是函数;它是一种数据结构,它不适用于任何东西。相反,您正在创建一个基于defaultConfig 的新配置,并将其keys 函数替换为新的匿名函数。 那个函数接受一个配置,并对其应用两个函数:你的mikeys,以及keys defaultConfig返回的任何函数。生成的两个 Maps 由您的配置的 key 函数合并并返回。

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

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 2017-06-05
    • 2020-11-01
    • 2012-02-24
    • 2010-11-30
    • 2018-10-29
    • 1970-01-01
    • 2017-02-18
    • 2020-03-25
    相关资源
    最近更新 更多