Как сокращаются функции клавиш XMonad? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь понять, как оцениваются функции конфигурации 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, и тогда полученная карта должна быть применена к c (если я правильно понял), но как Map можно применить к чему-либо?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Map не является функцией;это структура данных, и она ни к чему не применяется.Вместо этого вы создаете новую конфигурацию, основанную на defaultConfig, с заменой ее функции keys на новую анонимную функцию. Эта функция принимает конфигурацию и применяет к ней две функции: вашу mikeys и любую функцию, возвращаемую keys defaultConfig.Два полученных в результате Maps объединяются и возвращаются функцией key вашей конфигурации.

xmonad затем использует эту новую конфигурацию, которая включает в себя извлечение объединенного Map для настройки привязок клавиш.

0 голосов
/ 22 декабря 2018

Ваше описание не совсем корректно.keys - это поле записи.

Если у вас есть тип записи R с полем foo :: T, то сам foo (используется в качестве значения) имеет тип R -> T (этофункция доступа к записи).

Поскольку keys является полем XConfig, его тип на самом деле

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

In

keys defaultConfig c

Мы извлекаем keys поле от defaultConfig.Значение, хранящееся в этом поле, само является функцией, которую мы применяем к c, чтобы получить Map.

...