我试图了解如何评估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如何应用于某些东西?
答案 0 :(得分:2)
您的描述不太正确。 keys
是一个记录字段。
当您具有字段R
的记录类型foo :: T
时,foo
本身(用作值)的类型为R -> T
(这是一个记录访问器函数)。
由于keys
是XConfig
的字段,因此其类型实际上是
keys :: XConfig l -> !(XConfig Layout -> Map (ButtonMask, KeySym) (X ()))
在
keys defaultConfig c
我们从keys
中提取defaultConfig
字段。存储在此字段中的值本身就是一个函数,我们将其应用于c
以获得Map
。
答案 1 :(得分:1)
Map
不是一个函数;这是一个数据结构,它不会应用于任何事物。相反,您将基于defaultConfig
创建一个新配置,并用其keys
函数替换为新的匿名函数。 那个函数需要一个配置,并对其应用两个函数:mikeys
和keys defaultConfig
返回的任何函数。配置文件的Maps
函数合并并返回两个结果key
。
xmonad
然后使用此新配置,其中涉及提取合并的Map
来设置您的键绑定。