Ответы пользователя по тегу Функциональное программирование
  • Декаррирование / Uncurrying: как работает на лямбда исчислении?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Если на примере чистого лямбда-исчисления, то
    define Head = λg . g (λa . λb . a)
    define Tail = λg . g (λa . λb . b)
    define Uncurry = λf . λp . f (head p) (tail p)

    Вы уверены, что оно вам именно в таком виде надо, если вы саму концепцию не понимаете?
    Ответ написан
  • Сложно ли учить функциональное программирование?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Это зависит от развитости логического аппарата и абстрактного мышления, а не от знаний математики.
    Ответ написан
    Комментировать
  • «I’m a monoid in category of endofunctors» — что это значит?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Определение монады в теории категорий. Соответственно, чтобы понять это определение, придётся теоркат изучить хотя бы в основах. Поверхностно познакомиться с вопросом поможет тысяча и одна статья, которые гуглятся по этому определению. Например эта или эта.
    Ответ написан
    Комментировать
  • С чего начать учить функциональное программирование "одноклеточному"?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Если у вас действительно СДВГ, то программирование вам не осилить, это работа требующая высокой концентрации.
    Ответ написан
    5 комментариев
  • Что такое монада?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Моноид в категории эндофункторов.
    Ответ написан
    Комментировать
  • Насколько востребованны функциональные языки программирования, и почему их мало используют в коммерческой разработке?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Востребованы меньше, но зарплаты выше и условия лучше. Мало используют по нескольким причинам. Прежде всего из-за замкнутого круга: Для мало используемых языков мало программистов, а те языки, на которых мало программистов, мало используют. Но он постепенно "растягивается" и вполне может совсем разорваться через 5-10 лет. Кроме того, функциональный код выразителен и хорошо распараллеливается, но для многих компаний это не является значимыми достоинствами, а вот низкая скорость компиляции и высокое потребление ресурсов являются значимыми недостатками. Тем не менее, рекомендую выделить на ФП часть своих сил и времени. Как минимум это улучшит ваш алгоритмический аппарат. Как максимум даст полезную подготовку для будущего рынка труда. В конце концов, ООП тоже не сразу стал популярен.
    Ответ написан
    Комментировать
  • Какой функциональный язык переспективнее: Erlang или Scala?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Так с чего начать: Scala или Erlang(Elixir?)?

    Только вам решать. На мой взгляд лучше выучить оба и добавить ещё Clojure и Haskell. А потом уже выбирать.

    Что перспективнее у нас/за рубежом?

    Просмотрите вакансии. Сравните по количеству предложений и размерам зарплат.

    И можно их учить без знания Java?

    Можно.
    Ответ написан
    Комментировать
  • Есть ли в стандартной поставки Java 8-* тернарный оператор (условие? результат_true: результат_false) с лямбдами?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    В девятке есть Optional.ifPresentOrElse() и Optional.or(). В восьмёрке придётся изворачиваться:
    1. Использовать Optional.orElseGet()
    2. Использовать что-нибудь вроде
    requestTypeEntity.<Supplier>map(value -> () -> value)
                     .orElse(() -> {
                         logger.error("There is no request type with id = " + reqTypeId);
                         return EMPTY_VALUE;
                     })
                     .get();

    Либо колхозить свой функциональный интерфейс. Хотя, само желание что-то подобное сообразить выглядит как костыли для натягивания императивного стиля на функциональный.
    Ответ написан
    1 комментарий
  • Как быть c иммутабельными объектами в асинхронной (или многопоточной среде)?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Судя по тексту вопроса, вы мыслите категориями императивного стиля и объектно-ориентированной парадигмы, где переменная - это коробка, в которой лежат данные, а код - это последовательность конкретных действий, типа "возьми данные из коробки, прибавь к ним единицу, положи обратно в коробку". В ФП нет состояния/коробки. В ФП данные трактуются как последовательность их преобразований.

    Например есть некоторая функция складывающая аргументы:
    function addition(a, b) {
        return a + b;
    }

    И есть некое значение-аккумулятор X. Значение X не равно 7, значение X равно

    addition(addition(addition(addition(addition(addition(1, 1), 1), 1), 1), 1), 1)

    или addition(addition(addition(1, 2), 3), 1) или сотням других вариантов. То есть функции от предыдущих состояний, в математическом смысле.

    Естественно, в реальном мире не всё так радужно, как в теории. Совсем без состояния обойтись нельзя, и на низком уровне оно всё равно хранится как некоторое значение области памяти. Но функциональщику не приходится заморачиваться мелочами вроде порядка выполнения, синхронизацией и т.п. Он просто описывает высокоуровневые правила преобразований, а обо всём остальном беспокоится среда выполнения.

    Например в Clojure один из способов решить задачу подобную описанной вами - использовать атом.
    ;; Создаём счётчик с нулевым начальным значением
    (def counter (atom 0))
    
    ;; Применяем к нему функцию инкремента
    (swap! counter inc)

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

    Если развить задачу до работы с персистентными данными в базе, то для clojure-программиста сложнее она не станет. Достаточно использовать СУБД Datomic, построенную на идее event sourcing'а, при которой в БД хранятся не сами значения, а последовательность операций над ними. Эффект тот же, что и с атомом - сто клиентов одновременно зафиксировали в БД намерение увеличить counter, а сто первый получил результат применения ста инкрементов к начальному значению.
    Ответ написан
    4 комментария
  • Какие книги почитать по функциональному программированию?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Восприятие языка - это вопрос индивидуальный. То, что далось легко мне, может показаться сложным вам. И наоборот. Но личным опытом поделиться могу:

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

    Самой простой для изучения мне показалась Scala. Мультипарадигменность языка обеспечивает более лёгкое вхождение из императивного стиля программирования. Есть замечательный учебник "Scala для нетерпеливых" Кея Хорстманна. К тому же, вакансии на scala-программистов есть даже в РФ. Минусом для меня послужила как раз мультипарадигменность. Нет вызова, нет настоящей мозголомки, способствующей перекраиванию мышления.

    Erlang интересный, чисто функциональный, широко применяются. Но чувствуется некоторая незаконченность языка и отовсюду выпирает телекоммуникационное наследие. Есть неплохой учебник на русском Чезарини и Томпсона "Программирование в Erlang". Плюс, сейчас появился Elixir. Слышал, что он хорош и, что в нём решили все проблемы Erlang, но сам не щупал.

    Я в результате остановился на Clojure. Кложа сложная, но она реально учит думать по-новому. По ней много книг. В том числе есть на русском - "Программирование на Clojure" Эмерика. Хорошая документация, большое и дружелюбное сообщество. В реальном мире применяется чаще, чем Haskell, но реже Scala или Erlang.
    Ответ написан
    6 комментариев
  • С чего начать изучать функциональое программирование джависту?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Начать стоит с дотошного изучения механизмов ФП в самой Java. Тот же Stream API. Потом взяться за Scala. Мультипарадигменность языка облегчит вхождение. Тем более, что есть замечательная в своей простоте книга "Scala для нетерпеливых" Кея Хорстманна. А после можно будет поиграть с чисто функциональным языком Clojure, тоже работающим на всё той же привычной JVM.
    Ответ написан
    Комментировать