← All posts tagged Java

anton0xf
Java math dev fp tl:dr: Монада — это враппер с возможностью оперировать над завёрнутым значением. Если вы пишете на Java то уже наверняка знаете, что это. Никакой магии или скрытых смыслов.

Со мной щас случилось неожиданное. Т.к. я на Хаскелях и Скалах так никогда и не писал ничего длиннее пятка строк, то меня, как и большинство остальных людей несколько смущало понятие "монада". Хотя и знал уже, что по сути это всего лишь умное название для некоего враппера. Но всегда оставалось ощущение, что там есть какой-то более сложный нюанс, т.к. про всякие джавовые Optional и пр. обычно говорят "это близко, но не совсем оно", и добавляют с придыханием, что там есть ещё "монадические законы" и начинают разговор про Теорию Категорий, с которой у меня тоже как-то всё не складывается.
А тут на конфе в который раз зашла об этом речь, и я решил прикола для заглянуть в вику. Долистал до определения и всё понял!

java.util.Optional — это натурально монада. Как стримы и любой другой враппер, если к нему прицепить метод flatMap() с поведением, как у соответствующих методов Optional или Stream.

Раскрою на примере того самого Optional. Как пишут в вики монада `M` над типом `T` (пишут `M T`) — это тройка, состоящая из
1. конструктора типа (`M T`), т.е. например `Optional<T>`
2. конвертера `unit: T -> M T`. Напомню, что в стандартной математической нотации `f: X -> Y` — это функция из `X` в `Y`. Для моего примера это будет создание Optional из значения, т.е. в той же нотации: `Optional::<T>of : T -> Optional<T>`
3. и комбинатора `(>>=): (M T, T → M U) → M U`, т.е. функа, который употребляет монаду и другой функ, который из значения, в неё завернутого, делает другое значение, завёрнутое в эту же монаду, и применяет второе к содержимому первой. Т.е. в точности то, что делает Optional::flatMap, если понимать объект, у которого этот метод вызывается, как неявный первый аргумент. Точнее если у нас есть `x : Optional<T>` (переменная `x` типа `Optional<T>`), то `x::<U>flatMap : (T -> Optional<U>) -> Optional<U>` (или как пишут в javadoc: `Optional<U> flatMap​(Function<? super T,​? extends Optional<? extends U>> mapper)`), что отличается от сигнатуры в определении только тем, что `x` — это неявный параметр, поэтому его тип e у меня написан отдельно, но это исключительно синтаксическая особенность — в том же Python этот аргумент пишется в сигнатуре методов явно.

Ну а "законы" — это абсолютно тривиальные ожидаемые от врапера свойства:
+ `unit(x) >>= f <-> f(x)` — означает что flatMap() применяет свой аргумент с завёрнутому значению, а не делает что-то более хитрое: `Optional.of(x).flatMap(f) == f(x)`
+ `ma >>= unit <-> ma` — если есть переменная `x : Optional<T>`, то примерение `flatMap()` к `Optional::of` ничего не поменяет: `x.flatMap(Optional::of) == x`
+ `ma >>= λx → (f(x) >>= g) <-> (ma >>= f) >>= g` — некое правило ассоциативности применения `flatMap()`, т.е. если `x : Optional<T>`, и `f: T -> Optional<U>`, а `g: U -> Optional<V>`, то `x.flatMap(x -> f(x).flatMap(g)) == x.flatMap(f).flatMap(g)`
anton0xf
Java quote c.j.r A> такой вопрос — чтобы отсортировать коллекцию объектов по определённому полю объекта мне нужно создать свой компаратор?
B> да
...
A> спасибо
A> а по двум полям? к примеру поле даты и поле времени
C> так же, как и по одному, только по двум
anton0xf
humor Java dev ant ivy читаю доку по Apache Ivy:
(обсуждается подход, при котором каждому интеграционному билду модуля назначается отдельная версия, т.е. текущие билды в процессе разработки не переписывают старые, а хранятся все)
On the other hand, the main drawback of this solution
is that it can produce a lot of intermediate versions,
and you will have to run some cleaning scripts in your
repository unless your company name
starts with a G and ends with oogle :-)

там, вообще, много веселых шуток.
anton0xf
Java quote nya c.j.r
Игно-кун> а мой декрипт что должен возвращать
чтобы таблица няшной была?
ForNeVeR> Чтобы таблица была няшной — нужно возвращать котят.
anton0xf
Maven Java shit ? programming а как в мавене разруливать зависимости?
допустим, есть большой проект с не очень аккуратно написанными зависимостями и из-за этого что-то ломается. что делать?
аналогичная задача, при работе с emerge решается довольно удобно:
что-то сломалось — можно посмотреть какие еще доступны верии,
попробовать замаскировать последнюю версию или размаскировать более новую,
сразу увидев, какие изменения в версиях остальных пакетов потребуются.

собсно вопрос в том, есть ли аналогичные возможности?
или мавен — это хреновый менеджер пакетов?
anton0xf
Java code programming
интересная либа/eDSL на java для генерации sql - jOOQ.
например:
Connection c = null;
Table t = new TableImpl("test table");
Factory f = new Factory(c, SQLDialect.MYSQL);
System.out.println(f.select(field("A")).from(t).where(field("b").
    like(value("test")))

напечатает
select A from `test table` where b like 'test'
anton0xf
NetBeans Java Emacs ? а нет какого-нибудь плагина к первотегу, чтобы он стал вести себя более похоже на вроготег?
например, нет kill-ring'а. да и хоткеи в варианте "Emacs" не слишком последовательно расставлены.
а то давно не юзал его, а теперь оч неудобно(