вторник, 15 октября 2013 г.

Мысли об ФП

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

Вот вполне себе функциональный код на Java:

String reverseString(String str) {
    if (str.length() <= 1) {
        return str;
    } else {
        return
        str.charAt(str.length() - 1) +
        reverseString(str.substring(1, str.length() - 1)) +
        str.charAt(0);
    }
}

Побочных эффектов нету, соблюдается referential transparency.
Проблемы начинаются, когда код становится чуть сложнее, чем просто инвертирование строки. Попробуем написать функцию, которая инвертирует строки текста:

String reverseText(String text) {
    String[] lines = text.split("\n");
    String[] invertedLines = reverseLines(lines, 0, new String[0]);
    return Joiner.on("\n").join(invertedLines);
}

String[] reverseLines(String[] lines, int i, String[] invertedLines) {
    if (lines.length - i == 0) {
        return invertedLines;
    } else {
        return reverseLines(lines, i + 1,
            ObjectArrays.concat(invertedLines, reverseString(lines[i])));
    }
}

Справились, но пришлось добавить вспомогательный метод reverseLines. Естественным образом возникает мысль, что неплохо было бы его спрятать внутрь reverseText. И тогда можно не передавать lines в метод reverseLines, потому что она и так будет видна через замыкание. Таким образом, в функциональном языке мы должны уметь определять функции внутри функций.

Теперь надо написать функцию, которая не просто инвертирует строки текста, а, скажем инвертирует и ещё переводит их в верхний регистр. Очевидно, что функция будет отличаться от предыдущей одной лишь заменой reverseString на reverseStringAndToUpperCase. А дублировать код плохо. Тогда возникает мысль, а можно ли как-нибудь абстрагировать функцию reverseString от инвертирования? Назовём её transformTextа функцию reverseString  будем передавать как аргумент. Вот и возникло желание иметь функции как объекты первого класса.

Далее, наверное не сильно хочется писать функцию reverseStringAndToUpperCase? Ведь у нас уже есть reverseString и toUpperCase. Неплохо было бы уметь писать что-нибудь вроде reverseString.andThen(toUpperCase). Т.е. ещё возникает необходимость композиции функций в нашем языке.

Таким образом, писать без побочных эффектов - это трудная задача. А функциональные языки предоставляют инструменты, с помощью которых эту задачу можно значительно упростить.

понедельник, 14 октября 2013 г.

X vs Y

Windows vs Linux vs OS X
Git vs Mercurial vs SVN
Facebook vs Twitter vs Google+
Skype vs Gtalk
Microsoft vs Google vs Oracle
Eclipse vs IDEA vs Netbeans
Github vs Bitbucket vs Google Code
XML vs JSON vs YAML
Vim vs Emacs vs Sublime Text
Android vs iOS
Tabs vs Spaces
C# vs Java
CLR vs JVM
Ruby vs Python vs PHP vs JavaScript
Scala vs Clojure vs Erlang
Static Typing vs Dynamic Typing
Any X vs Any Y

Может, уже пора просто делать свою работу?

суббота, 2 июня 2012 г.

Победа

Давно ничего не писал. Вообще последний год выдался паршивый. Очень много болел :(

Все началось с того, что в августе я сильно подвернул лодыжку, спускаясь по лестнице. Сильно растянул связки :( Две недели пришлось работать из дома, потом еще три недели ездил на работу на такси. Через 2 месяца нога зажила, и я с дуру пошел в поход. Без подготовки. От малоподвижного образа жизни сильно ослабли колени, в результате чего в первый же день похода начал болеть левый коленный сустав. Оставшиеся 3 дня пришлось идти через боль.

После похода в конце ноября заболел ОРВИ :( Серьезно. Зверски болело горло. Пил парацетамол и антибиотики. Когда стало легче, и я уже было думал, что вылечился, начал пить холодную воду. На следующий день горло заболело опять. На этот раз болезнь меня наказала сильнее. Вылечиться не мог с месяц. Ходил к терапевту и к лору. К середине января горло прошло, но осталось температура :(. Каждый день поднималась до 36.9-37.1. Я не знал, что делать. Плюс еще нужно было что-то делать с ногами, как-то укреплять их. Но тренироваться, бегать я не могу, ибо болел. Решил работать стоя (работал так 2 месяца). Терапевт выписал направление к эндокринологу. Сделал кучу анализов. Эндокринолог поставил диагноз АИТ - повышенные антитела к ТПО и повышенное содержание ТТГ. Ну думаю, хрен с ним, буду лечиться от АИТ. Каждый день жрал левотироксин натрия и йод (по рецепту). Через 1.5 месяца стало хуже :( Передозировка привела к учащенному сердцебиению и пониженному ТТГ. Температура осталась :( Эндокринолог сказал отменить йод и снизить дозу левотироксина натрия. Стало чуть легче. Но я не чувствовал себя здоровым.

Потом мне позвонили и позвали в единичку на Джунгарский Алатау. Я думаю, пес с ним, может хоть физкультура меня вылечит. Начал готовиться к походу, бегать, не обращая внимания на температуру. Плюс еще невролог выписал витамины внутримышечно. И черт возьми, помогло! В походе я чувствовал себя отлично. Работа стоя тоже сделал свое дело: колени не заболели даже к концу похода. Вернулся счастливым:)

Сейчас июнь, и симптомов болезни нету. От похода отошел и продолжаю тренироваться :) Зимой собираюсь в двойку. Так что никогда не унывайте ;)