Как упрощаются функции клавиш XMonad?

Я пытаюсь понять, как оцениваются функции конфигурации XMonad. Первый пример взят из документов Xmonad:

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 возвращает Map при применении к некоторому XConfig, а затем Map, который у нас есть, должен быть применен к c (если я правильно понял), но как Map может быть применен к чему-то?


person aryndin    schedule 22.12.2018    source источник
comment
Легко: у вас нет нужного типа для keys.   -  person Daniel Wagner    schedule 22.12.2018


Ответы (2)


Ваше описание не совсем верно. 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.

person melpomene    schedule 22.12.2018
comment
Спасибо, data XConfig исходный код прояснил для меня все ;-) - person aryndin; 22.12.2018

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

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

person chepner    schedule 22.12.2018