Обновить
12.35

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

От Lisp до Haskell

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

Что такое класс типов?

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров7.9K

Давайте разберем, что такое класс типов. Обратимся к формальному определению:

Класс типов (type class) — это абстрактный параметризованный тип, который позволяет добавлять новое поведение к любому закрытому типу данных без использования подтипов.

Класс типов - это в первую очередь про "поведение". Когда мы определяем класс типов, то неявно заключаем "контракт", в котором описываем желаемое для определяемого класса типов поведение.

Читать далее

Слово Божие — функциональное программирование как основа Вселенной

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров44K

В одном из своих предыдущих постов под названием "Эйлер, Чёрч и Мандельброт — этюд о красоте и математике" я немного затронул тему рассмотрения функционального программирования в качестве основы реальности. Под тем постом было оставлено множество интересных комментариев, один из которых, написанный @nickolaym, вдохновил меня на развитие мысли в данном направлении. Так появился этот пост, в котором прямо как во времена пифагорейской школы и платоновской академии философия переплелась с математикой, а математика с философией.

Читать далее

Как справиться с эмоциональным выгоранием. 13 советов

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.6K

Работа организма состоит из множества процессов в нем происходящих и психических и физических, но любая деятельность задействует не все процессы, а некоторые из них, какие-то сильней, какие-то слабей. (Художник больше использует воображение и работу рукой, певец голос и слух, инженер внимание и концентрацию, боксер реакцию и физику).

Что такое эмоциональное выгорание? Попробуем разобраться в этом вопросе с точки зрения физиологии. А во второй части статьи я поделюсь с вами 13-ю полезными советами, как в нашем современном, бушующем, информационно перегруженном мире не перегореть и не получить эмоциональное расстройство.

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

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

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

Читать далее

Конкурентный отказ

Время на прочтение11 мин
Количество просмотров4.5K
Любая задача может быть завершена несколькими способами:
  1. Нормальное завершение, после которого мы получаем результат (например, Ничего/Единица).
  2. Сообщение об ошибке.
  3. Принудительное завершение, после которого программа может остаться в неопределённом состоянии.

В корутинах Python есть известные точки для безопасной приостановки выполнения. Пользуясь ими, можно автоматически подводить программу к результатам #1 и #2. Поскольку приостановка потоков происходит по принципу вытеснения, именно программист, реализующий потоки, отвечает за достижение результатов #1 и #2. При работе с потоками всегда сохраняется вероятность исхода #3 – поток может быть уничтожен извне, а задача этого даже не заметит, и не получит ни одного шанса осуществить очистку после выполнения и аккуратно завершиться. С потоками существуют две фундаментальные проблемы: (A) невозможно узнать, когда их работа может быть прервана из-за переключения контекста в операционной системе и (B) никогда не угадаешь, когда поток может быть принудительно завершён. Поэтому при работе с потоками принято писать код так, чтобы A и B не имели значения. При конкурентной обработке это неприемлемо, поэтому, если речь идёт о конкурентности, то вариант #3 мы должны полностью исключить.
Читать дальше →

Книга «Грокаем функциональное программирование»

Время на прочтение2 мин
Количество просмотров22K
image Привет, Хаброжители!

Вам кажется, что функциональное программирование — это нечто сложное, доступное только гуру программирования? Эта книга развенчает миф об элитарности и позволит любому программисту с легкостью разобраться в хитросплетениях кода.

От знакомых и простых идей ООП вы перейдете к ФП, рассматривая его на простых примерах, захватывающих упражнениях и большом количестве иллюстраций.

Вы начнете с решения простых и маленьких задач, иллюстрирующих базовые понятия, такие как чистые функции и неизменяемые данные, научитесь писать код, лишенный типичных ошибок, обусловленных наличием сложного распределенного состояния, разберетесь с подходами к реализации ввода-вывода, параллельного выполнения и потоковой передачи данных. К концу книги вы будете создавать ясный функциональный код, который легко читается, тестируется и сопровождается.
Читать дальше →

Функциональное программирование в Python: ежедневные рецепты

Уровень сложностиСредний
Время на прочтение21 мин
Количество просмотров18K
Как говорится, спроси пять программистов, что такое функциональное программирование, получишь шесть разных ответов. В целом это программирование через функции в их математическом понимании, то есть когда функция принимает что-то на вход и что-то возвращает на выходе, не меняя глобального состояния.

В своей команде — команде разработки инструментов для разработчиков под KasperskyOS — мы создаем разные интересные консольные утилиты, эмулятор, обеспечиваем интеграцию с IDE и так далее. И для этого мы используем разные языки — C++, C, TypeScript; но больше всего пишем на Python.



В этой статье, которая написана по следам моего выступления на конференции PiterPy, я обращаюсь к практикующим разработчикам — расскажу о том, какие функциональные приемы можно использовать в этом языке. Сконцентрируюсь на практике — на тех примерах, которые можно использовать уже буквально сейчас, не переписывая свой проект.
Читать дальше →

В Java 21 собираются реализовать сопоставление с образцом – так, глядишь, я снова на этот язык перейду

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

Преуведомление

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

Выпуск Java 21 состоялся 19 сентября 2023 года. В этой версии поддерживаются паттерны записи в switch-блоках и выражениях. Такой синтаксис выглядит монументально (как минимум, по меркам Java). Это водораздел, после которого мы вправе говорить, что в Java полноценно поддерживаются паттерны функционального программирования, подобно тому, как это сделано в Kotlin, Rust или C#. Вот и первый пункт, который пробуждает во мне зависть (я Kotlin-разработчик).

Читать далее

Вывод оптимального алгоритма с помощью формализма Бёрда-Меертенса

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров3.2K

Некоторые оптимальные алгоритмы, оказывается, можно вывести из неоптимальных, пользуясь эквивалентными преобразованиями алгоритма. Бёрд и Меертенс разработали формализм, который устанавливает свойства функций высшего порядка map, fold, scan, позволяющие преобразовывать алгоритмы в эквивалентные. (См. также на Вики). Ниже представлен вольный перевод статьи Бёрда.


Рассмотрим задачу поиска максимальной суммы сегмента массива. Эту задачу можно переформулировать в виде математически точного ответа:


Для всех сегментов, которые можно получить из массива, необходимо посчитать сумму чисел, а затем среди всех таких сумм найти максимальную.
Читать дальше →

Теория типов

Уровень сложностиСредний
Время на прочтение43 мин
Количество просмотров40K

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

Что можно узнать из этой статьи?

Ad-hoc-полиморфизм и паттерн type class в C#

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров19K


Эта статья объясняет, что такое ad-hoc-полиморфизм, какие проблемы он решает и как вообще его реализовать, используя паттерн type class на языке программирования C#.
Читать дальше →

Бестолковые тесты versus качественное ПО. Часть 3. Что получится?

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров887

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок. Рассмотрели те задачи, в которых тесты хорошо себя проявляют.


Попробуем разобраться, что получится, если применить все эти соображения к тестам из первой части.

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 5. Применимость юнит-тестов

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров1.1K

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код и выводить программы из требований. Рассмотрели классификацию ошибок.


Видя необоснованные надежды, возлагаемые на юнит-тесты, хотелось бы понять, что в действительности можно ожидать от тестов.

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 4. Эквивалентность функций

Уровень сложностиСложный
Время на прочтение14 мин
Количество просмотров862

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код. Рассмотрели классификацию ошибок.


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

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

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 3. Ошибки

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров629

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и предложили "распрямлять" код.


Теперь посмотрим, от каких ошибок защищают тесты, а от каких — другие инструменты из арсенала разработчика.

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

Бестолковые тесты versus качественное ПО. Часть 2. Что делать? 2. «Распрямляем» код

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров956

В первой части мы рассмотрели примеры тестов, из которых не все одинаково полезны. Затем попытались определиться, что же такое качество ПО, и как подходить к вопросу тестирования с системной точки зрения.


Теперь рассмотрим один из аспектов разработки, позволяющий уменьшить необходимое количество тестов — "прямолинейность" кода (как понятие, противоположное цикломатической сложности).

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

Бестолковые тесты versus качественное ПО. Часть 1. Бестолковые тесты

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2K

Сталкивались с тестами, которые толком ничего не тестируют? А тесты, которые что-то тестируют, но при этом всё равно постоянно возникают баги? Может быть, тесты, которые приходится каждый раз исправлять?


Несложно построить тест, обеспечивающий 100% покрытие, но при этом ничего не проверяющий и не гарантирующий. (См., например).


Проблемы юнит-тестов уже затрагивались на Хабре ранее:



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

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

Преимущества функционального программирования на примерах C#

Время на прочтение7 мин
Количество просмотров8.3K
Функциональное программирование (ФП) — это парадигма, в которой упор делается на использование функций для решения задач, а не на состояние и изменяемые данные. В последние годы ФП завоевало популярность среди разработчиков благодаря многочисленным преимуществам, которые позволяют использовать его для разработки сложных систем. В этой статье мы расскажем о преимуществах функционального программирования и о том, почему вам стоит рассмотреть возможность его использования в вашем следующем проекте.
Читать дальше →

Что такое формальная верификация

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров8.6K

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

Формальная верификация — это доказательство с использованием математических методов корректности программного обеспечения.

Формальная верификация молода. На сегодняшний день, на сайте хабр, например, нет (пока) специализации «Формальная верификация», нет специальности «Proof инженер» или «Специалист по формальной верификации». А люди, работающие по этой специальности — есть.

Программное обеспечение, которое прошло формальную верификацию считается надежным. Формальная верификация дает (с математической точностью) гарантии того, что программный код не будет содержать конкретных ошибок, что функции будут вести себя так, как ожидается.

В основе формальной верификации лежат математические методы. Слово «формальный» в названии - это отсылка к математике. Для доказательства утверждений о программном коде используются формальные методы математики: математическая логика, лямбда исчисление, теория категорий, математический анализ, алгоритмы для работы с функциональными и императивными структурами данных.

Инструменты для верификации — это программные средства для доказательства теорем (Coq, Isabelle ...), а также SAT-solvers.

В 70х годах предки формальной верификации — это доказательства простых утверждений о программе (конкретной функции) с помощью ручки и листка бумаги. Сегодня — это (иногда многолетние) исследовательские проекты для конкретного программного обеспечения, вот некоторые из них:

Читать далее

Python кодогенерация — ускоряем strftime / strptime

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.9K

Привет! В первой и второй частях я поделился историей создания python библиотеки convtools (кратко: позволяет декларативно описывать преобразования данных, из которых генерируются python функции, реализующие заданные преобразования), сейчас расскажу об ускорении частных случаев datetime.strptime и datetime.strftime, а также о том интересном, что встретилось в datetime модуле по дороге.

Читать далее

Парсер комбинаторы на Python

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров5.4K

Статья предлагает взглянуть на опыт разработки парсер комбинаторов для Python, что вылилось в библиотеку PGPC для разработки парсеров на Python. Библиотека была вдохновлена Parsec.
Особый интерес представляет эмуляция do-нотации через Python генераторы, отсюда и название библиотеки: Python Generator based Parser Combinator library.

Читать далее