Я высовываю модуль XMonad.Actions.WindowMenu
из xmonad-contrib
, пытаюсь сделать его настраиваемым.
И мне трудно понять следующий бит:
В Исходный код представляет собой такую конструкцию, как:
windowMenu :: X ()
windowMenu = withFocused $ \w -> do
tags <- asks (workspaces . config)
-- ...
Как лучше всего go понять, что там происходит? Другими словами, в каком контексте оценивается целое tags <- asks (workspaces . config)
?
Причина, по которой я спрашиваю, заключается в том, что, когда я пытаюсь реорганизовать это в другую функцию:
defaultActs :: [(String, X ())]
defaultActs = do
tags <- asks (workspaces . config)
[ ("A: " ++ tag, return ()) | tag <- tags]
it взрывается с ошибкой:
• No instance for (MonadReader XConf [])
arising from a use of ‘asks’
• In a stmt of a 'do' block: tags <- asks (workspaces .
In the expression:
do tags <- asks (workspaces . config)
[("A: " ++ tag, return ()) | tag <- tags]
In an equation for ‘defaultActs’:
defaultActs
= do tags <- asks (workspaces . config)
[("A: " ++ tag, return ()) | tag <- tags]
Отредактировано, чтобы добавить:
Я понимаю типы этого утверждения:
ghci> :t asks (workspaces . config)
asks (workspaces . config) :: MonadReader XConf m => m [String]
ghci> :t withFocused
withFocused :: (Window -> X ()) -> X ()
, но причина, по которой он ломается (все еще ) загадка.