Тыкаю модуль XMonad.Actions.WindowMenu
из xmonad-contrib
, пытаюсь сделать его настраиваемым.
И мне трудно понять следующий бит:
В исходный код представляет собой конструкцию типа:
windowMenu :: X ()
windowMenu = withFocused $ \w -> do
tags <- asks (workspaces . config)
-- ...
Как лучше понять, что там происходит? Другими словами, в каком контексте оценивается все tags <- asks (workspaces . config)
?
Причина, по которой я спрашиваю, заключается в том, что когда я пытаюсь реорганизовать это в другой функции:
defaultActs :: [(String, X ())]
defaultActs = do
tags <- asks (workspaces . config)
[ ("A: " ++ tag, return ()) | tag <- tags]
вылетает с ошибкой:
• 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 ()
но причина, по которой он ломается, (до сих пор) остается загадкой.