За годы прошедшие с их появления в Java8 у меня набралась коллекция полезных решений и шаблонов, которые я переносил из проекта в проект, и которые в стандартной версии так и не были осуществлены. Недавно я решил собрать все вместе в небольшом проекте с открытым кодом. В первом релизе проекта расширения охватывают следующие аспекты:
Функциональное программирование *
От Lisp до Haskell
Новости
Restricted IO в Haskell
В статье описывается механизм создания собственного модифицированного варианта монады IO в Haskell, с ограничениями операций ввода-вывода.
Хорошим тоном организации структуры любой программы на Haskell считается разделение кода на блоки, выполняющие IO операции ввода-вывода и блоки, полностью состоящие из чистых функций, т.е. функций, не выполняющих IO операций, а лишь принимающие на вход некоторые данные и возвращающие их в преобразованном виде. Такого рода чистые блоки по сути представляют из себя функции в математическом смысле слова, принимающие аргумент и возвращающие значение функции, и напоминают программы зари компьютерной эры, когда данные с перфокарт загружались в программу в самом начале её работы, после чего некоторое время обрабатывались, и по итогу работы программы выводила на печать итоговый результат расчётов, при этом в ходе работы программы не предполагалось никакого интерактивного взаимодействия с ней.
Чтобы добавить в программу интерактивность, но при этом максимально сохранить математическую целостность функций, применяется примерно такой подход:
8. Nix в пилюлях: Универсальные скрипты сборки
Продолжаем знакомство с Nix и NixOS. В прошлых статьях мы научились собирать пакеты Nix (деривации), а теперь попробуем написать универсальный скрипт сборки, который можно было бы использовать для сборки множества пакетов.
Люка Бруно продолжает свой захватывающий рассказ.
Вычислительные выражения: Реализуем Delay и Run
Скотт Влащин продолжает рассказ о вычислительных выражениях в F#. Вычислительные выражения очень похожи на монады из Haskell, но у них есть свои особенности.
Одной из необычных особенностей Haskell являются ленивые (отложенные) вычисления. В F# вычисления энергичные, как и в большинстве других языков, поэтому там нельзя просто так взять и "прервать" вычисление.
Но если очень хочется, то можно. В этой статьей Скотт рассказывает, как сделать ленивые вычислительные выражения в F#.
Истории
7. Nix в пилюлях: Работающая деривация
В прошлой пилюле мы собрали свою первую деривацию. Правда, она не делала ничего полезного, и эту оплошность надо исправить.
В очередной — седьмой — пилюле от Люка Бруно создадим деривацию, которая реально собирает и устанавливает программу в хранилище Nix.
Вычислительные выражения: Реализуем Combine
Вычислительные выражения — поистине неисчерпаемая тема. Мы научились возвращать пустые значения, а теперь нам предстоит разобраться, как возвращать множественные. Скотт Влащин рассказывает, как использовать метод Combine
.
6. Nix в пилюлях: Наша первая деривация
Медленно, но верно мы добрались до шестой пилюли, посвящённой пакетному менеджеру и чистому функциональному языку Nix.
Попробуем создать нашу первую деривацию.
Вычислительные выражения: Реализуем Zero и Yield
Шестая статья из цикла про вычислительные выражения. Скотт Влащин начинает рассказывать детали реализация, и это в два раза интереснее, чем раньше.
Разбор монады ContT, или как написать продвинутый goto, генераторы и файберы на хаскеле
В этой статье я разберу монаду ContT
, и покажу как вернуть return
и другие control-flow операторы из императивных языков программирования, которых мне так нехватало, когда я начинал изучать хаскель.
5. Nix в пилюлях: Функции и импорт
Пятая часть в цикле статей Люка Бруно рассказывает о функциях в языке Nix. Оказывается, у них не бывает имени и только один параметр. Как такое может быть?
Читаем статью, разбираемся. Помимо функций, вы также узнаете, как в Nix устроены модули и их импорт.
Вычислительные выражения: Подробнее про типы-обёртки
Пятая статья из цикла про вычислительные выражения, написанная популяризатором Скоттом Влащиным.
Глубже погрузимся в исследование типов-обёрток и узнаем, наконец, почему список тоже может быть обёрткой.
Постфиксный калькулятор на Haskell
Можно ли внедрить в Haskell постфиксный калькулятор?
begin push 1 push 2 add end
begin push 1 push 2 push 3 add mul end
На первый взгляд такой код на Haskell не может работать. Функция begin должна иметь произвольное количество аргументов, а Haskell является языком со статической типизацией. Но на самом деле, для написания вариативных (polyvariadic) функций достаточно полиморфизма.
Обобщённые типы. Часть 3/3. Применение контейнерных типов
В последней третьей части обзора продемонстрировано, как на основе обобщённых типов-контейнеров реализуются различные ФП-техники “чистого” построения “эффективных” программ. В заключении будет отмечена роль теории категорий в обосновании важности абстракций, построенных над обобщёнными типами.
Ближайшие события
Обобщённые типы. Часть 1/3. Полиморфные типы высокого рода
В предыдущей статье раскрывались некоторые базовые понятия теории типов. В этот раз мы рассмотрим обобщённые типы (generics) – необходимость появления такой абстракции, ключевые особенности и различные сценарии использования в программировании.
Обобщённые типы. Часть 2/3. Классы типов и контейнеры
Это вторая часть обзора обобщённых типов, в которой мы расскажем о классах типов и типах-контейнерах.
Вычислительные выражения: Типы-обёртки
Четвёртая статья из цикла Вычислительные выражения Скотта Влащина. Скотт рассказывает о типах-обёртках и об их глубокой связи с вычислительными выражениями.
4. Nix в пилюлях: Основы языка
Четвёртая часть из цикла статей Люка Бруно, посвящённой пакетному менеджеру и языку программирования Nix.
Здесь мы знакомимся с основами языка.
3. Nix в пилюлях: Погружаемся в среду
Третья статья из цикла Nix в пилюлях. Наконец-то, практика! Разбираемся, что такое окружения и поколения, учимся откатывать изменения, выясняем, как работать с каналами
Программирование вне парадигм
Вычислительные выражения: Введение в 'Bind'
Третья статья из цикла про вычислительные выражения в F#. Продолжаем разбираться с функциями-продолжениями и исследуем метод "Bind".