Все потоки
Поиск
Написать публикацию
Обновить
13.62

Функциональное программирование *

От Lisp до Haskell

Сначала показывать
Порог рейтинга
Уровень сложности

Грокаем монады

Время на прочтение7 мин
Количество просмотров13K

Самый распространенный способ объяснить монаду - зайти через теорию категорий. Знать, что монада - это моноид в категории эндофункторов и увлекательно и полезно для общего развития, но слабо помогает в практическом смысле. Второй, равный по популярности прием - прибегнуть к помощи образов, и вот мы уже складываем значения в коробочки и достаем их оттуда (или, вообще кошмар, катимся по железной дороге). Не спорю, образы - хороший способ посмотреть на явление, но тут мы равно удалились и от теории категорий и от практики.

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

Читать далее

Обработка исключений в Java в функциональном стиле

Время на прочтение4 мин
Количество просмотров28K

В данной статье автор предоставит информацию о собственной библиотеке для обработки исключений (Exception) в функциональном стиле.

Предпосылки

В Java начиная с версии 8 появились новые возможности в виде функциональных интерфейсов и потоков (Stream API). Эти возможности позволяют писать код в новом функциональном стиле без явных циклов, временных переменных, условий ветвления и проч. Я уверен что этот стиль программирования станет со временем основным для большинства Java программистов.

Читать далее

Как я пагинацию на telebot делал (пагинация для telegram бота)

Время на прочтение13 мин
Количество просмотров20K

История о том, как мы пагинацию для бота делали.

Разберемся с начала, что это за статья зачем она и для кого. Пришлось мне в рамках хакатона "Поколение ИТ" писать бота для телеги.

Но готового решения для пагинации, которое бы нам подходило мы не нашли. Поэтому было принято решение изобретать велосипед. Решение моих товарищей было максимально странным, брать количество записей и перебирать их в цикле от 1 до N (конца, записей), но данная идея сразу была отброшена. Поэтому предоставляю вашему вниманию наше творчество, которое мы изобрели.

Читать далее

Лямбда-функция в Python простыми словами

Время на прочтение5 мин
Количество просмотров433K

В этой статье вы подробнее изучите анонимные функции, так же называемые "лямбда-функции". Давайте разберемся, что это такое, каков их синтаксис и как их использовать ( с примерами).

Лямбда-функции в Python являются анонимными. Это означает, что функция безымянна. Как известно, ключевое слов def используется в Python для определения обычной функции. В свою очередь, ключевое слово  lambda  используется для определения анонимной функции.

Читать далее

Применение обобщённой свёртки для обработки синтаксических деревьев

Время на прочтение16 мин
Количество просмотров4.2K

Привет, Хабр! В статье я покажу, как представить синтаксические деревья с помощью фиксированной точки для функторов. Такое представление позволяет снабжать каждый лист дерева дополнительной информацией о самом листе (например позицией выражение в файле с программой), при этом непосредственно перед обработкой листа мы можем убрать из него эту информацию. Таким образом во время обработки в конструкторах синтаксического дерева будут находиться только необходимые данные, что позволяет писать более чистый код для его обработки. К концу статьи мы напишем интерпретатор для простого императивного языка программирования, на примере которого будет показано всё вышеперечисленное

Читать далее

Потоковая обработка данных в go

Время на прочтение5 мин
Количество просмотров8.6K

При использовании языка Go чувствуется нехватка хорошей библиотеки для работы с потоками данных. Имеющиеся библиотеки в основном написаны во времена до дженериков и имеют не очень удобный интерфейс.

С выходом Go 1.18 появилась возможность реализовать библиотеку потоковой обработки данных goio, вдохновлённую превосходными Scala-библиотеками cats-effect и fs2.

Читать далее

Что такое мемоизация? Как и когда использовать мемоизацию в JavaScript и React

Время на прочтение10 мин
Количество просмотров39K

В данном переводе рассказывается о том, что такое мемоизация, зачем её использовать. Также представлены основные примеры на JavaScript и React, демонстрирующие работу мемоизации.

Развернуть

С++ без классов?

Время на прочтение6 мин
Количество просмотров20K

(на картинке изображён С++ среди других функциональных языков)

Классы - это скорее всего первое, что добавил Страуструп в далёких 1980х, ознаменовав рождение С++. Если представить, что мы археологи древних плюсов, то косвенным подтверждением этого факта для нас будет this, который по прежнему в С++ является указателем, а значит, скорее всего, он был добавлен до "изобретения" ссылок!

Но речь не про это, пора окинуть взглядом пройденный с тех пор путь, изменение и языка и парадигм, естественный отбор лучших практик, внезапные "великие открытия" и понять к чему это всё привело язык, который когда то вполне официально назывался С с классами (ныне мем).

В конце(СПОЙЛЕР) мы попытаемся превратить С++ в функциональный язык за несколько простых действий.

Для начала рассмотрим базовое применение классов:

Начать погружение

Агрегаты

Время на прочтение16 мин
Количество просмотров23K

Я считаю, что именно агрегаты из Domain-Driven Design лежат в основе поддерживаемых информационных систем. Однако эта концепция малоизвестна за пределами DDD-сообщества и довольно сложна для понимания, поэтому я решил написать очередной пост посвящённый агрегатам. В основном для чтобы структурировать собственное понимание агрегатов и создать "методичку" для своих команд, но и широкой общественности, я надеюсь, этот пост тоже может быть полезен.

Что такое агрегат?

Властелин структур

Время на прочтение15 мин
Количество просмотров11K

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

Читать далее

Scala: Гексагональная архитектура и DDD на Free Monad в функциональном программировании

Время на прочтение8 мин
Количество просмотров4.3K

Привет Хабр! Пятничного тру ФП хардкора с Free Monad, Таглес Финал, Монад трансформерами, Refined Types, Smart Constructors и прочим таким вам в ленту. Хардкор сам себя в ленту не принесет так что погнали.

Гексагональная архитектура делит наш код на три основные части.

1) Primary Adapters,

2) Secondary Adapter

3) Logic aka Domain.

Читать далее

Scala: Авторизация. Защита API с помошью Bearer токена

Время на прочтение3 мин
Количество просмотров4.5K

В это пример я буду рассматривать только парсинг и валидацию токенов что уже пришли в мое API в Authorization хедере. Для генерации токенов, регистрации пользователей и прочего SSO есть много готовых решений которые легко установить или даже устанавливать не надо. Например, Auth0, Keyckloak, IdentityServer4. В пример е буду работать с Tapir который может использовать в качестве бекенда http4s, Akk HTTP, Netty, Finatra, Play, ZIO Http, Armeria. Я буду использовать Tapir + Http4s.

Читать далее

Абстрактная алгебра в действии

Время на прочтение6 мин
Количество просмотров29K

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

Читать далее

Ближайшие события

Nanopass или как я писал компилятор этой осенью

Время на прочтение8 мин
Количество просмотров5.7K

image


Сразу прошу прощения за несколько надоевший всем стиль «lytdybr», но уж очень хочется поделиться крайне приятным опытом и рассказать о по-своему замечательном компиляторном курсе. И это ещё хорошо, что я пишу сейчас, когда эмоции подугасли, а не когда я только закончил вторую главу курса и от эйфории чувствовал себя как «хомячок, которого капля никотина разрывает на части»! Сразу предупреждаю, наверняка для кого-то эта заметка — «ребёнок познаёт мир», тех прошу сразу закрыть вкладку и не судить строго. Здесь и далее, всегда и всюду, во всех четырёх сферах прошу учитывать, что я не только не создаю компиляторы, но даже и не обучаю этому и не пишу методички! ;-)

Читать дальше →

Обзор языка функционального программирования Koka

Время на прочтение5 мин
Количество просмотров8.1K

Как-то заглянув на GitHub, обнаружил Koka — язык функционального программирования со статической типизацией. Koka разрабатывается с 2012 года Daan Leijen в Microsoft Research, USA. Его исходники выкладываются на GitHub под лицензией Apache 2.0. Как признаются его авторы, он ещё не готов для промышленного применения: у него нет библиотек, менеджера пакетов и полной поддержки в средах разработки. При этом сам язык достаточно стабилен, а компилятор полностью разработан. Отдельными моментами язык напоминает Rust, Haskell и Scala. Сам же по себе он интересен контролем побочных эффектов. Это его основная фишка. Приглашаю познакомиться с Koka и обсудить его свойства.


fun main(): console ()
  println("Hello, World!")

Сначала пробежимся по свойствам языка, а затем рассмотрим один небольшой пример.

Читать дальше →

Функциональный Kotlin. Часть 2. Каррированные функции и где они обитают

Время на прочтение2 мин
Количество просмотров7.6K

Вторая статья из цикла о функциональном программировании на Kotlin с разбором принципа работы, концепции и способов применения каррирования на практике.

Читать далее

Применения — слева, аргументы — справа

Время на прочтение4 мин
Количество просмотров3.2K

В предыдущей статье (Заберите свои скобки), мы попытались избавиться от скобочек с помощью нового оператора для передачи аргументов. На основе своего опыта пользования оператором, можно конечно подобрать нужный приоритет, но он все равно будет конфликтовать в случаях, которые мы не предусмотрели. Что же делать? У меня есть идея, но она вам может не понравится.

Опять чем-то скобки не угодили?

Знакомство с p-адическими числами. Часть 2, практическая

Время на прочтение13 мин
Количество просмотров6.5K


Эта часть продолжает неформальный рассказ о p-адических числах и она посвящена практическим аспектам работы с этой числовой системой и, в частности, некоторым деталям реализации p-адической алгебры на языке Haskell. О том, что это за система и зачем она может понадобиться, читайте в предыдущей части.


Мы поговорим об эффективном внутреннем представлении p-адических чисел, о базовых алгоритмах и методах работы с ними, а также о двух классных инструментах в системе типов языка Haskell: о типах-литералах (type literals) и семействах типов (type families).

Читать дальше →

Мой путь к Magmide

Время на прочтение9 мин
Количество просмотров1.3K

Как я постепенно пришёл к мысли о том, что нам необходимо создать средство проверки доказательств теорем и вывести формальную проверку в мейнстрим.

Читать далее

А вы знаете, где используется Haskell?

Время на прочтение4 мин
Количество просмотров29K

Всем привет! Мы хотим продолжить серию постов на тему “где используются эти ваши странные языки программирования”. В прошлый раз мы рассказали про Лисп, а сегодня продолжим разговор про функциональные языки и обратим внимание на Haskell.  Он является основным языком разработки в Typeable и, конечно, мы не смогли пройти мимо такой темы.

Haskell — чистый функциональный язык программирования общего назначения. Среди его отличительных особенностей можно выделить строгую статическую типизацию, ленивые вычисления, алгебраические типы данных и серьёзную теоретическую основу. Это относительно молодой язык, он появился в 1990 году, но уже оказал значительное влияние на другие языки и на теорию языков программирования в целом.

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

Читать далее