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

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

От Lisp до Haskell

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

Замыкания и декораторы в Python: часть 2 — декораторы

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

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

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

Читать далее
Всего голосов 9: ↑7 и ↓2 +5
Комментарии 4

Новости

Зачем в Scala трамплины и как их использовать

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

В этой статье директор департамента разработки российской компании «Криптонит» и «скалист» Алексей Шуксто рассказывает о специфической технике функционального программирования, которая называется «трамплин» (trampoline).

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

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

Чтобы вникнуть в детали, поясним ещё несколько моментов:

Читать далее
Всего голосов 16: ↑16 и ↓0 +16
Комментарии 6

Как изучить Haskell всего за 15 лет

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

Haskell — это язык программирования, изобретённый в 20-м веке шотландскими логиками в качестве пранка (вероятно). Примерно пятнадцать лет назад я начал изучать Haskell по причинам, которые уже и не упомню. Сегодня я наконец написал полезную программу на Haskell и уверен, что смогу сделать это снова, если мне когда-нибудь понадобится ещё одна компьютерная программа.

Я не знаю, как изучал функциональное программирование в целом и Haskell в частности. В 2006-м я следил за проектами why the lucky stiff и читал передовой тамблелог Леа Нойкирхен Anarchaia, и какой-то из этих источников познакомил меня с миром за пределами ООП. В декабре 2006 года Леа опубликовала на Anarchaia ссылку на Pandoc, и тогда я впервые узнал о своём любимом ПО и языке, на котором оно было написано.
Читать дальше →
Всего голосов 63: ↑58 и ↓5 +53
Комментарии 9

Реализация динамического списка на WL

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

Это тематическое продолжение моей предыдущей статьи, которая описывала реализацию связанного списка на Wolfram Language. На этот раз мы будем делать динамический список. Где-то его называют просто список либо динамический массив. В C# эта структура представлена типом List<T>, а в Java наиболее похожим классом является ArrayList, хотя насколько я помню называют его динамический массив.

Цель этой статьи - демонстрация возможностей и трюков языка Wolfram. А так же это руководство по созданию своих структур данных. Кроме того, возможно, эта статья будет полезна тем, что только начинает изучать программирование и в частности структуры данных.

Ниже реализация динамического массива/списка на Wolfram Language.

Читать далее
Всего голосов 1: ↑1 и ↓0 +1
Комментарии 2

Истории

Велосипедим связанный список на Wolfram

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

Возможно 11 подписчиков моего блога обратили внимание на тот факт, что все мои статьи касаются языка Wolfram, а несколько последних статей вышли довольно громоздкими. Одна из последних статей была помечена Хабром как требующая в среднем 32 минуты на прочтение. Я посчитал, что это может отпугнуть пользователей (все 11 человек и не факт, что все они до сих пор читают Хабр) и решил попробовать писать более короткие статьи. Плюс я сам перестану теряться в большом количестве текста.

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

Ниже реализация структуры данных LinkedList на Wolfram Language.

Читать далее
Всего голосов 9: ↑9 и ↓0 +9
Комментарии 4

Арифметика первого класса в системе типов Rust

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

Арифметика – наука непростая, но к нашему удобству работу с ней можно облегчить с помощью экспрессивной системы типов языка Rust. В статье мы разберём реализацию на этом языке простейших математических операций, таких как сложение, вычитание, умножение и деление.
Читать дальше →
Всего голосов 60: ↑59 и ↓1 +58
Комментарии 7

Стиль написания кода на Wolfram Language

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

Я как большой фанат Wolfram Language (WL) очень часто изучаю открытые репозитории с кодом на этом языке. Изучив достаточно много кода я заметил, что стиль написания этого кода очень сильно разнится от проекта к проекту. Но так же я изучил много встроенных пакетов в Mathematica/Wolfram Language, которые были написаны разработчиками из Wolfram Research. В большинстве случаев они были написаны еще хуже (т.е. более неструктурированно и без единого стиля) чем пакеты такого же объема и сложности в открытом доступе. Но и среди проектов на GitHub и среди пакетов в языке мне попадались те, которые действительно хорошо написаны. Постепенно у меня сформировалось понимание того стиля, который будет наиболее прост и понятен большинству пользователей WL. В этой статье я хочу поделиться своим мнением и задокументировать тот стиль и ту конвенцию, которую я постепенно выработал для себя. Возможно, это станет еще кому-то полезно и изучив от корки до корки эту статью, а лучше вызубрив, чтобы от зубов отскакивало, вы станете так быстро решать уравнения и строить графики, что...

Читать далее
Всего голосов 14: ↑14 и ↓0 +14
Комментарии 28

О функциональном программировании на примере решения судоку

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

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

Читать
Всего голосов 21: ↑20 и ↓1 +19
Комментарии 26

Calypso: Схема данных MongoDB на Scala

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

Чтобы применять Domain-Driven Design, DDD Aggregate и Transactional outbox на MongoDB, наша команда создала open source — библиотеку calypso для работы с BSON.

Публикация для тех, кто стремится к современным практикам разработки и разделяет наше влечение к Scala 3.

Готовы к открытиям? Добро пожаловать в мир функционального программирования и надёжной работы с schema-on-read.

Читать далее
Всего голосов 74: ↑74 и ↓0 +74
Комментарии 7

Замыкания и декораторы в Python: часть 1 — замыкания

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

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

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 17

Вся мощь паттернов в Wolfram Language

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

Редкая птица долетит до середины Днепра, не каждый разработчик осилит все паттерны в WL. Нет ему равных языков в паттерн-матчинге. Чуден и необычен язык этот. Изобилует он точками, подчеркиваниями, да запятыми так, что в глазах рябит, да разум мутнеет.

В этой статье я постараюсь сделать как можно более подробный обзор на механизм сопоставления с образцом в Wolfram Language (WL) и покажу реальные примеры, где я сам и мои товарищи его активно используют. А также я поделюсь всеми неочевидными тонкостями работы с шаблонами, с которыми лично я столкнулся в процессе написания кода на WL. По возможности я буду приводить примеры на других языках программирования - на Python и C#. Это позволит всем, кто не знаком с WL лучше понять код и сравнить синтаксис.

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Комментарии 12

Применение алгебраических типов данных для моделирования ошибок и сообщений в журнале

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

В функциональном программировании широко используются так называемые алгебраические типы данных. Такие данные формируются из более простых типов с использованием всего двух операций — "суммы" и "произведения". Использование таких математических операций оказывается очень удобным с точки зрения последующей обработки с помощью сопоставления с образцом ("паттерн-матчинг"/pattern matching).


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


В этой заметке посмотрим на примеры моделирования ошибок и сообщений логирования.

Читать дальше →
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 1

Функциональный Rijndael

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

Rijndael (авторы Vincent Rijmen, Joan Daemen) - алгоритм, признанный стандартом шифрования в 2001 году, ныне называемый AES (Advanced Encryption Standard).

Материалов про AES много, и я сразу выделю отличие этой статьи от других:

• приведена реализация шифра в функциональной парадигме;

• рассматривается полная версия Rijndael с 9 вариациями длин блока и ключа, а не урезанный AES до 3 вариаций;

• реализовано шифрование файлов;

• я старался объяснить математическую составляющую для неподготовленного читателя так, чтобы была понятна философия, смыслы и образы происходящего, а не мелкие технические детали;

• использоваться будет Haskell, однако для читателя знание этого языка не требуется, поскольку все конструкции будут пояснены.

Читать далее
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 10

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

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн

ООП в Wolfram Mathematica

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

В комментариях к мой статье пользователь @Refridgeratorв ответ на мой вопрос написал, что в Wolfram Language (WL) не хватает следующего:

"ООП, перегрузки операторов, строгой типизации, событийно-ориентированного
программирования, дата-ориентированного программирования, параллельного программирования с примитивами синхронизации, средств отладки, скорости исполнения." (с) @Refridgerator

Я отлично понимаю, что вокруг Mathematica сложились некоторые исторические стереотипы. В них обычно WL представляется как калькулятор на стероидах или просто игрушка, или больше язык запросов, которым можно дополнительно решать уравнения и строить графики. Сегодня я попытаюсь показать, что в языке есть не только лишь графики, уравнения и интегралы. Вряд ли у меня хватит сил написать подробно касательно каждого пункта списка, но я постараюсь объяснить хотя бы часть.

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Комментарии 15

Какие методы используются для сбора данных о твоем браузере? Как собирают информацию о пользователях?

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

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

Читать далее
Всего голосов 14: ↑5 и ↓9 -4
Комментарии 0

ФП виновно в снижении стоимости программ. Вот мои доказательства, господа присяжные заседатели

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

Среди особенностей моего подхода к разработке у моих заказчиков, коллег и студентов наибольшее сопротивление вызывает использование Spring Data JDBC, а не [Spring Data] JPA (де-факто стандарта работы с БД на платформе Java).

Изначально я собирался писать пост "Почему не JPA", но немного подумав понял, что ответ умещается в одно предложение: потому что JPA по своей природе (persistence context и dirty checking) не поддерживает неизменяемую модель данных - неотъемлемую часть функционального стиля программирования, который, в свою очередь, является неотъемлемой частью моего подхода к разработке. И это объективный факт.

Почему для себя я выбрал ФП, а не "нормальное" императивное программирование? На этот вопрос также можно ответить одним предложением: потому что функциональный стиль помогает мне снижать стоимость разработки для бизнеса и делать руководителей проектов счастливыми.

Уверен, многие не согласятся с истинностью утверждения "применение функционального стиля ведёт к снижению стоимости разработки". Поэтому я пока буду называть его Гипотезой и приведу факты, доказывающие её истинность.

Какие ваши доказательства?
Всего голосов 21: ↑18 и ↓3 +15
Комментарии 56

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

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

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

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

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

Читать далее
Всего голосов 7: ↑4 и ↓3 +1
Комментарии 12

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

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

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

Читать далее
Всего голосов 64: ↑54 и ↓10 +44
Комментарии 103

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

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

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

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

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

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

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

Читать далее
Всего голосов 14: ↑4 и ↓10 -6
Комментарии 9

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

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

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

Вклад авторов