Как стать автором
Обновить
20.75

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

От Lisp до Haskell

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

16. Nix в пилюлях: Параметры nixpkgs

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

Вы начинаете сборку вашего пакета не на пустом месте. Репозиторий nixpkgs, куда входит ваш пакет, при запуске скрипта сборки передаёт ему параметры. В этой главе мы поговорим о двух основных параметрах: system и config.

Читать далее

Импортозамещение SCADA: опыт перевода крупного производства на отечественную платформу

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

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

Летом 2023 года к к нам обратилось предприятие химической промышленности крупного Российского холдинга. На нем  много лет использовалась SCADA-система Wonderware InTouch. Из-за санкционных наложений, иностранный вендор расторг контракт на обслуживание и техподдержку. Более того, была предпринята попытка удаленно остановить производство путем отключения серверов SCADA. Последствия удалось минимизировать, изолировав промышленную сеть, однако функционал системы снизился на треть, а ее развитие и масштабирование оказалось невозможным. Нам было необходимо решить следующие проблемы:

1.     Отсутствие возможности обслуживания данной системы. Ввиду того, что данную SCADA систему разрабатывала и обслуживала иностранная компания, после начала СВО все контракты по обслуживанию и технической поддержке были расторгнуты. 

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

Читать далее

15. Nix в пилюлях: Поисковые пути Nix

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

В Nix для поиска дериваций используется переменная окружения NIX_PATH. Она похожа на PATH, но есть и важные отличия. Разбираемся с тем, как устроен репозиторий nixpkgs.

Читать далее

14. Nix в пилюлях: Паттерн проектирования override (переопределение)

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

Продолжаем изучать паттерны проектирования, используемые при создании пакетов в Nix. В этой пилюле разберёмся с паттерном override (переопределение).

Читать далее

Истории

Фундаментальная математика — теория всего в IT и не только. Теория типов и формализация в Coq

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

У нас есть 3 "теории всего" - научная картина мира (все сводится к законам физики), информатика (все сводится к битам) и фундамент математики (все сводится к логике). Именно фундамент математики представляет особый интерес, так как он является фундаментом для двух других фундаментов и имеет глубокий философский смысл. Последние 2 года я сильно им увлекся и проделал довольно большую работу по углубленному изучению теории типов (Calculus of Constructions), и готов поделиться результатами, а также рассказать о девяти направлениях, где можно применить это на практике. Очень многое получилось лучше, чем я планировал. Изначально перспективы были не очень понятными, и поэтому я не рассказывал друзьям и коллегам про мою работу в этом направлении и называл это «Секретный Проект». Но теперь, когда многое прояснилось и получилось, можно поделиться успехом. Собственно, в этой статье я расскажу вам не только про сам фундамент математики, а еще его связь с ежедневной работой программиста, а также с Computer Science/Data Science и AI/ML. Я вам нарисую большую и красивую картину, на которой все понятно и логически следует из маленького набора правил выведений типов (11 штук) и аксиом теории множеств (9 штук).

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

Читать далее

13. Nix в пилюлях: Паттерн проектирования callPackage

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

Разбираемся, как работает второй из базовых паттернов Nix — callPackage. Автоматизируем передачу параметров, сокращаем код репозитория.

Читать далее

Использование ZLayer без «сервисов»

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

В заметке "Идиоматическое внедрение зависимостей в ZIO 2" Пьер Рикадат описывает типичную структуру Scala-приложения на основе ZIO. Элементами этой структуры являются использование интерфейсов, классов с зависимостями и dependency injection.

Известен также подход, описанный в заметке "От внедрения зависимостей к отказу от зависимостей" Марка Симана. Автор прежде был апологетом внедрения зависимостей и написал об этом книжку. Но в функциональном подходе можно строить системы без зависимостей, что требует отказа сразу от интерфейсов, классов с зависимостями и от понятия dependency injection.

Хотелось бы посмотреть, как те же примеры, что приводит Пьер Рикадат, будут выглядеть без классов и интерфейсов. А также понять, можно ли использовать ZLayer'ы при разработке программ в функциональном стиле.

Читать далее

Идиоматическое внедрение зависимостей в ZIO 2

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

Перевод заметки Пьера Рикадата о механизме ZLayer в ZIO2 ("Idiomatic dependency injection for ZIO applications in Scala", Pierre Ricadat).

---

Я (автор оригинальной заметки) часто слышу в Интернете в Scala-обсуждениях, что ZLayer "слишком сложный" или "лишний". Эти совершенно противоречит моему опыту: я считаю, что ZLayer - невероятно крутая технология! В предыдущих версиях ZIO действительно были проблемы (те, кто помнит тип данных Has[_], знают, о чем я говорю!), но с тех пор всё поменялось. В этой статье я покажу идиоматическое использование ZLayer для DI (dependency injection, внедрение зависимостей) и надеюсь продемонстрировать, как это позволяет делать сложные вещи очень простым способом.

Примечание: Я много лет работал с приложениями ZIO (ещё даже до выхода версии 1.0!), и в настоящее время я работаю над серверной частью большой многопользовательской онлайн-игры, полностью написанной на Scala и использующей ZIO. Примеры в этой статье основаны на этой кодовой базе.

Читать далее

12. Nix в пилюлях: Репозитории пакетов и паттерн Входные параметры

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

Разбираемся в тонкостях разработки пакетов. Изучаем паттерны, которые применяются при создании пакетов и репозиториев в Nix.

Читать далее

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

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

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

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

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

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

Читать далее

Практика использования парсер-комбинаторов peco и оператора match для создания простых DSL на языке Python

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

Задачи разработки компиляторов и интерпретаторов конфигурационных языков или даже полноценных Тьюринг-полных языков программирования время от времени встают перед разработчиками программного обеспечения. На практике, как правило, речь идёт о разработке предметно-ориентированных языков (англ. Domain Specific Language, DSL), проектируемых специально для решения узкого класса прикладных задач.

В статье рассматривается один из способов реализации DSL на примере разработки системы символьного дифференцирования, как в SymPy, с использованием парсер-комбинаторов peco и структурного сопоставления с образцом по PEP 636. Материал рассчитан на прикладных разработчиков, уже знакомых с Python, но, надеюсь, может быть полезен и продолжающим компиляторщикам.

Читать далее

Рекурсивные типы. Часть 5/5. Занимательный матан

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

Содержание пятой части:

Натуральные числа
Разложение в ряд
Производные от типов
Производные от экспоненциалов
Производные от рекурсивных типов

Читать далее

Рекурсивные типы. Часть 4/5. Схемы рекурсии

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

Содержание четвёртой части:

Обобщение свёрток/развёрток
Параморфизм и другие схемы рекурсии
Хистоморфизм
Футуморфизм

Читать далее

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

4 – 5 апреля
Геймтон «DatsCity»
Онлайн
8 апреля
Конференция TEAMLY WORK MANAGEMENT 2025
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область

Рекурсивные типы. Часть 3/5. Свободные контейнеры

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

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

Свободный контейнер
Более свободный контейнер
Батуты
Ко-свободный контейнер
Промежуточный итог

Читать далее

Рекурсивные типы. Часть 2/5. Неподвижные точки конструкторов типов

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

Содержание второй части:

Неподвижные точки конструкторов типов
Начальная F-алгебра
Наибольшая неподвижная точка
Классы типов неподвижных точек

Читать далее

Рекурсивные типы. Часть 1/5. Рекурсия

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

Слово «рекурсия» происходит от латинского «recursio» – «круговорот, возврат». Применительно к вычислениям этот термин относится к алгоритмам, повторяющих какие-либо действия. Этот обзор посвящён типам, которые обслуживают рекурсивные алгоритмы.

Это вводная часть и собственно про типы здесь будет мало что сказано. Содержание:

Вычислимые функции
Циклы и рекурсия
Cтек и хвостовая рекурсия
Ссылки вперёд
Y-комбинатор в λ-исчислении
Реализация комбинатора неподвижной точки

Читать далее

Структурный дизайн. Древний секрет простого и быстрого кода

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

Я пишу коммерческий код с 2005 года и с 2014 года ищу способ систематически писать хороший код.

В рамках этих поисков я изучил всю популярную литературу о хорошем коде и его дизайне — от «Чистого кода» Анкл Боба до «DDD» Эрика Эванса. Однако все популярные подходы в значительной степени субъективны: они не дают объективного и последовательного судьи, который бы решал, какой код лучше.

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

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

Отчаявшись научиться писать стабильно хороший объектно‑ориентированный код, в 2016 году я пошёл в сторону функционального программирования и архитектуры. Там с детерминированностью было получше: если в коде нет побочных эффектов (ввода‑вывода, оператора присваивания и чтения глобальных переменных) — то код хороший, если есть — плохой. Однако как затащить в коммерческий проект и, главное, собственную голову свободные монады и их интерпретаторы — я так и не понял.

Поэтому в 2020 году поиски своего Святого Грааля я продолжил в «эзотерических» и древних книгах. Одной из таких книг стал «Структурный дизайн» Ларри Константина. И в этой книге я, наконец, нашёл простой и понятный принцип, который лёг в основу моего текущего подхода к проектированию и кодированию, и для которого можно быстро и однозначно дать ответ, соответствует ли тот или иной кусочек кода этому принципу или нет.

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

Читать далее

Шестидесятилетний заключённый и лабораторная крыса. F# на Godot. Часть 3. Алгоритмы c пересадками

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

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

Читать далее

Two-Tier Data Model архитектура: концепт и мысли

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

Краткая цель статьи — сделать потоки данных проще, более тестируемыми и управляемыми с DTO и Runtime Model структурой.

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

Концепт использует немного функционала Entities, описанных Robert C. Martin (Uncle Bob) в Clean Architecture, также Model‑Driven engineering вместе с концептом immutability.

Эта статья:

— разделена на секцию теории и применения, чтобы статью можно было понять разработчикам не знающим язык используемый в примерах (Dart).
в основном фокусируется на client‑side (frontend, app, server‑side рендеринг) разработчиках, но думаю что может быть интересна и другим разработчикам..
— для примеров используется абстрактное финансовое приложение и язык Dart.

Читать далее

На самом деле, ООП — это не так уж плохо

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

ООП — определённо не самая моя любимая парадигма, но я считаю, что в мейнстримном ООП со статической типизацией кое-что сделано правильно, и это очень важно для программирования.

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

Затем я сравню ООП-код с Haskell, чтобы показать, что ООП не так плох во всём, как, похоже, считают поклонники функционального программирования.
Читать дальше →