LINUX.ORG.RU

История изменений

Исправление sf, (текущая версия) :

Что значат в конфиге $ и <+>? (Например строка 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, :

Что значат в конфиге $ и <+>? (Например строка 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 обработчика (а они уже решают, рисовать что-то юзеру или нет).