LINUX.ORG.RU

Конфиг потерял работоспособность

 ,


0

4

Жил и не тужил с вот таким вот конфигом для ксмонада http://pastebin.com/bunpryv5. Проблемы начались, когда мне пришло в голову этот xmonad обновить. Заодно и перекомпилил конфиг (изменения не производились), но вот компиляция завершилась немного неуспешно


xmonad.hs:83:9:
    No instance for (LayoutClass l0 Window)
      arising from a use of ‘xmonad’
    The type variable ‘l0’ is ambiguous
    Note: there are several potential instances:
      instance (LayoutClass l a, LayoutClass r a) =>
               LayoutClass (Choose l r) a
        -- Defined in ‘XMonad.Layout’
      instance LayoutClass Full a -- Defined in ‘XMonad.Layout’
      instance LayoutClass l a => LayoutClass (Mirror l) a
        -- Defined in ‘XMonad.Layout’
      ...plus 13 others
    In the expression: xmonad
    In a stmt of a 'do' block:
      xmonad
      $ myUrgencyHook
          (defaultConfig
             {terminal = "/usr/bin/xfce4-terminal", modMask = mod4Mask,
              focusFollowsMouse = True, clickJustFocuses = True, borderWidth = 1,
              normalBorderColor = colorBlackAlt,
              focusedBorderColor = colorWhiteAlt2, workspaces = myWorkspaces,
              startupHook = myStartupHook, handleEventHook = myHandleEventHook,
              layoutHook = myLayoutHook, manageHook = myManageHook,
              logHook = myTopLeftLogHook topLeftBar
                        <+> myTopRightLogHook topRightBar
                        <+> myBotLeftLogHook botLeftBar
                        <+> myBotRightLogHook botRightBar
                        <+> ewmhDesktopsLogHook
                        >> setWMName "LG3D",
              keys = myKeys, mouseBindings = myMouseBindings})
    In the expression:
      do { r <- getScreenRes ":0" 0;
           topLeftBar <- dzenSpawnPipe $ dzenTopLeftFlags r;
           topRightBar <- dzenSpawnPipe $ dzenTopRightFlags r;
           botLeftBar <- dzenSpawnPipe $ dzenBotLeftFlags r;
           .... }

xmonad.hs:409:9:
    Context reduction stack overflow; size = 21
    Use -fcontext-stack=N to increase stack size to N
      Show (Mirror ResizableTall GHC.Word.Word64)
    In the expression: configurableNavigation noNavigateBorders
    In the second argument of ‘($)’, namely
      ‘configurableNavigation noNavigateBorders
       $ minimize
         $ maximize
           $ mkToggle (single TABBED)
             $ mkToggle (single FLOATED)
               $ mkToggle (single MIRROR)
                 $ mkToggle (single REFLECTX)
                   $ mkToggle (single REFLECTY)
                     $ onWorkspace (myWorkspaces !! 1) webLayouts
                       $ onWorkspace (myWorkspaces !! 2) codeLayouts
                         $ onWorkspace (myWorkspaces !! 4) chatLayouts $ allLayouts’
    In the expression:
      gaps [(U, panelHeight), (D, panelHeight)]
      $ configurableNavigation noNavigateBorders
        $ minimize
          $ maximize
            $ mkToggle (single TABBED)
              $ mkToggle (single FLOATED)
                $ mkToggle (single MIRROR)
                  $ mkToggle (single REFLECTX)
                    $ mkToggle (single REFLECTY)
                      $ onWorkspace (myWorkspaces !! 1) webLayouts
                        $ onWorkspace (myWorkspaces !! 2) codeLayouts
                          $ onWorkspace (myWorkspaces !! 4) chatLayouts $ allLayouts
Как это пофиксить?

★★★

где-то у тебя тип не довыводится.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от LIKAN

Уррра, заработало. А что эта опция делает? Увеличивает размер стека? какого стека?

В haskell98/2012 алгоритм вывода типов гарантированно завершается.

Но расширение 'FlexibleContexts' требует более сложного выводителя типов. Если интересно про type-level вычисления на древнем MPTC+FD:
http://userpages.uni-koblenz.de/~laemmel/TheEagle/dl/Hallgren01.pdf

Чтобы гарантировать завершимость компилятора ghc вводит ограничение на глубину разрешения рекурсивных инстансов ( http://www.haskell.org/ghc/docs/7.8.2/html/users_guide/type-class-extensions.... - Undecidable Instances).

sf ★★★ ()

А нечего делать конфиги на полноценном ЯП. А хаскель - наименее пригодный вариант из тех, что могут прийти в голову.

Virtuos86 ★★★★★ ()

Ух ты, какая тяжелая наркомания. Надо тоже попробовать.

anonymous ()
Ответ на: комментарий от anonymous

Петросянам желательно прыгать в топку биореактора.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Пока не написали WM на Агде, Хаскель - наиболее пригодный вариант

anonymous ()
Ответ на: комментарий от Virtuos86

А нечего делать конфиги на полноценном ЯП.

Не хватаент второй половины фразы. Иначе что?

~/.xmonad/xmonad.hs - нормальная программа (даже 'main' есть).
Нормальным программам нормальные языки.

А хаскель - наименее пригодный вариант из тех, что могут прийти в голову.

Для описания конфигов? А какие приходят?

Назовите «лучшую» с вайшей точки зрения альтернативу - обсудим.

sf ★★★ ()
Ответ на: комментарий от sf

Иначе что?

Иначе помимо возможностей полноценного ЯП поимеешь и его проблемы. У ТС возникла проблема ведь не из-за xmonad, а из-за хаскеля.

Для описания конфигов? А какие приходят?

Любой простой язык, желательно без избытка синтаксического сахара. Есть же такие дурацкие WM, которые как-то обходятся обычными текстовыми файлами, или там башем, представляете.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Проблема возникла из-за того, что в хмонаде у комбинации лайаутов вместо типа - динамическая лапша

anonymous ()
Ответ на: комментарий от sf

JSON например. Не знаю случаев, когда в конфигах требовалось описывать какие-то алгоритмы. Поэтому языки разметки тут подойдут лучше, тем более, что парсить их удобнее. Перегружать фунциональность ни к чему.

Aswed ★★★★★ ()
Ответ на: комментарий от anonymous

в хмонаде у комбинации лайаутов вместо типа - динамическая лапша

ага, типичная проблема WM :-). то есть разрабы сами еще себе проблемы создают, не справляясь с выбранным инструментом?

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Aswed

И как мне из JSON узнать, что у ключа в новой версии поменялось название, или вместо строки от меня ждут число?

anonymous ()
Ответ на: комментарий от Aswed

Перегружать фунциональность

А она перегружена — если посчитать xmonad/xmonad-contrib/xmonad-extra (которые вообще библиотеки), то там сотни модулей, так что «конфиг» это код main самого WM с использованием всего добра (кому сколько нужно), если кому-то нужны конфиги в JSON, то пусть подключает Data.Aeson и пишет обработку конфигов на «конфигах» :)

quasimoto ★★★★ ()
Ответ на: комментарий от Aswed

Не знаю случаев, когда в конфигах требовалось описывать какие-то алгоритмы

Когда конфиг в духе «ключ => значение» то на его формат абсолютно пофиг. В более сложных случаях формат конфига может превратиться в чудовище которое уже сложно поддерживать, но оно ещё мало что умеет. Пример: конфиги nginx где до сих пор не реализованы полноценные ветвления (if..else). Как результат, конфиг часто превращается в лапшу.

Вот тебе ещё один наглядный пример: https://github.com/kopchik/vmc/blob/master/example.py

В этом конфиге я могу простым циклом создать хоть 100500 виртуалок с нужными свойствами (что периодически и делаю). В классическом ini-style конфиге мне бы его пришлось генерить чем-то внешним.

парсить их удобнее

Конфиг на ЯП вообще парсить не надо.

true_admin ★★★★★ ()
Ответ на: комментарий от Virtuos86

Иначе помимо возможностей полноценного ЯП поимеешь и его проблемы. У ТС возникла проблема ведь не из-за xmonad, а из-за хаскеля.

Решение «проблемы» было написано прямо в ошибке.

Любой простой язык, желательно без избытка синтаксического сахара.

Haskell - очень простой.

Есть же такие дурацкие WM, которые как-то обходятся обычными текстовыми файлами, или там башем, представляете.

xmonad.hs - «обычный текстовый файл» :].
Не думаю, что bash встроен хоть в один WM.

sf ★★★ ()
Ответ на: комментарий от sf

Что объяснить?

Бесполезно. Я испуган конфигом на 1032 строк!

beastie ★★★★★ ()
Ответ на: комментарий от sf

Хотя, если не затруднит, преведи мне маленький ликбез. Что значат в конфиге $ и <+>? (Например строка 100 и 404.)

beastie ★★★★★ ()
Ответ на: комментарий от beastie

Что значат в конфиге $ и <+>? (Например строка 100 и 404.)

Все загогулины со «спесцимволами» '!#$%&*+./<=>?@\^|-~' - это инфиксные операторы (то, что пишется между операндами, как 'a + b').

-- - однострочный комментарий

Про '$':

'$' - оператор для тех, кому лень ставить скобки.

Обычный синтаксис передачи аргумента/тов в функцию выглядит как:

    print (cos (sin (0.1 + 0.001)))
а веселый синтаксис:
    print $cos $sin $0.1 + 0.001

Или для реального примера:

    myFloaU = named ("Unique " ++ myFloaName) $ mouseResize $ noFrillsDeco shrinkText myTitleTheme simplestFloat
имеет смысл вего лишь:
    myFloaU = named ("Unique " ++ myFloaName) ( mouseResize ( noFrillsDeco shrinkText myTitleTheme simplestFloat ) )

'$' можно воспринимать как «перевернутый оператор 'точка'» в C++/C#/Ruby/Python, etc.

    new_o = f1 a1 $ f2 a21 a22 $ f3 $ o
имел бы грубый аналог
    new_o = o.f3().f2(a21, a22).f1(a1)

В данном случае берется дефолтный 'simplestFloat' (это «структура из нескольких» полей из XMonad.Layout.LayoutModifier.ModifiedLayout) и немного корректируется.

Из-за того, что вся программа - это пара-тройка таких выражений, '$' - один из самых популярных операторов.

В стандартной библиотеке он определен так:

    f $ x = f x
    infixr 0 $ -- правоассоциативный, с самым низким приоритетом

Если нравится «черезточечный стиль» - можно определить свой оператор

   x & f = f x
   -- или подождать ghc-7.10: http://git.haskell.org/ghc.git/commitdiff/1bf6c0e482cfe4b9dfa0b5ed18a5741ba44fc226

Про '<+>':

Смысл этого оператора «объединять две объединяемые сущности» (формально, это бинарная операция над множеством monoid).

Определяется аж вот так:

    (<+>) = mappend -- для тех, кому лень писать 'mappend a $ mappend b $ mappend c': a <+> b <+> c

В отличие от '$':

  • имеет 2, а не 1 аргумент
  • имеет разный смысл для разных типов объектов

Проспые примеры: - строки:

    "hello" <+> " " <+> "world" -- результат - "hello world"
- числа:
    getSum (Sum 4 <+> Sum 8) -- результат 12
    getProduct (Product 4 <+> Product 8) -- результат 32
- (и наш случай), объекты типа 'X a':
    myTopLeftLogHook topLeftBar <+> myTopRightLogHook topRightBar <+> ...
или
    xmonad_action1 <+> xmonad_action2 <+> ...
обозначает «выполнить дествия xmonad_action1, потом xmonad_action2, потом ... и объединить из результаты (уже другого типа, не 'X a' оператором <+>».

Это просто последовательное выполнение действий (коллбеков) 'xmonad_action1', 'xmonad_action2'. Весь код от функции 'main' (начало программы):

    xmonad $ ... $ defaultConfig { ..., logHook = наша-портянка, .. }

Тут берется дефолтный конфиг 'defaultConfig' и в нем замещается дефолтный коллбек (поле в структуре с именем logHook) на наш.

Он каждое событие от xmonad отправляетаж в 4 дочерних dzen обработчика (а они уже решают, рисовать что-то юзеру или нет).

sf ★★★ ()
Последнее исправление: sf (всего исправлений: 1)
Ответ на: комментарий от sf

Большое и огромное спасибо! Это пролило для меня немнога света.

Для меня была беда что все эти хитрые операторы не гуглятся и в cheatsheet их почему-то тоже нет. (Или я просто ещё не встречал.)

А используетеся (по крайней в xmonad) повсеместно, но нигде толком не оговорено в документации.

Теперь хоть стало яснее, что это и зачем.

beastie ★★★★★ ()
Ответ на: комментарий от quasimoto

У ($) тоже же два

Ох, соврал, да. Сорри.

sf ★★★ ()
Ответ на: комментарий от beastie

Для меня была беда что все эти хитрые операторы не гуглятся и в cheatsheet их почему-то тоже нет. (Или я просто ещё не встречал.)

Понимаю. Операторы - очень популярный механизм для построения маленьких EDSL-ей (часто одни и те же операторы по-разному определены в разных модулях).

Такие штуки можно в GHCi подсматривать:

$ ghci ~/.xmonad/xmonad.hs
-- или в случае этого топика '$ ghci ~/that-fun-pastebin.hs'

Обычные функции можно выискивать через ':info':

:info myTopLeftLogHook

myTopLeftLogHook :: Handle -> X ()
        -- Defined at that-fun-pastebin.hs:535:1

Операторы в скобки надо брать (они так в обычные функции «преобразуются»):

:i (<+>)

(<+>) :: Data.Monoid.Monoid m => m -> m -> m
        -- Defined in ‘XMonad.ManageHook’

А когда модуль есть - можно уже искать док/деализацию:

http://hackage.haskell.org/package/xmonad-0.11/docs/XMonad-ManageHook.html

sf ★★★ ()
Ответ на: комментарий от beastie

Почитай learn you a haskell for a great good. Там очень доступно объясняется суть многих вещей (в т.ч. операторы и некоторые паттерны). После неё начинаешь понимать что люди нашли в хаскеле.

А вот другие книги мне не понравились — они лезут в математику и это всё сильно усложняет. Пожалуй, хаскель лидирует по кол-ву бесполезных ликбезов для начинающих.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

По-моему я на эту книгу уже когда-то натыкался. Спасибо за ссылку. Но даже в ней тонешь в куче пустых примеров. А пока что sf дал мне краткое и лучше объяснение, которе я встречал. Если бы в природе был туториал такого же плана!

beastie ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.