Почему C++/Java/C# слабые языки

первая часть В Java 8 так и не появились функции первого класса (функции как типы), однако поддерживаются объекты первого класса (в частности, интерфейсы). Для демонстрации уязвимости системы типов Java воспользуемся примером, предложенным Tony Morris-ом, одним[…]

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

Сколько монад в твоём коде?

Хоть и принято языки наподобие C++/Java/C#/… относить к языкам с сильной типизацией, но так ли это на самом деле? Далее мы убедимся, что эта «сильная типизация» повсеместно крайне уязвима, покритикуем мэйнстримовскую критику «сильной типизации», и[…]

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

Уничтожаем императивность CPS-трансформацией

[первая часть]   Сразу отмечу, что в последних версиях C# существует поддержка CPS! Но мы начнём с классических генериков.   Вот у нас есть обычная функция, просто возвращающая само значение: T Foo<T>(T val) { return[…]

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

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

В любом крупном Java/C#/C++/…-проекте обычно можно найти множество функций, «возвращающих» void — то есть не возвращающих ничего, а просто выполняющих какие-то действия. Это типичная манера императивных кодировщиков, имеющая очевидный серьёзный минус.   Небольшое отступление: существует[…]

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

Взламываем принцип иммутабельности

После мозгового штурма и бессонной ночи учёный придумывает гениальную идею, которая перевернёт весь мир. Он лихорадочно пишет её на доске, после чего окружает крупными надписями «ПОЖАЛУЙСТА НЕ УДАЛЯЙТЕ ЭТО!!!», и выходит за чашечкой кофе. Через[…]

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

О теории типов для чайников

Когда собираешься почитать что-то про зависимые типы, желание обычно быстро угасает после примерно таких разъяснений: «Зависимые типы должны описываться слоями морфизма; чтобы придать этому смысл в категориях, мы перестаём говорить о слоях морфизма, а начинаем[…]

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

Комбинаторная литература

первая часть 4. Ice-Bound Concordance — визуальный роман с разными дополнительными игровыми фичами. На первый взгляд, он смотрится сложной приключенческой игрой главного героя — вас самого, но на самом деле это история KRIS — AI-подобия[…]

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

7 примеров игрового AI

AI в играх разрабатывается, понятно, с появлением самой первой игры, в которой был хотя бы один компьютерный соперник. Вроде бы все базовые идеи тут уже давно придуманы, но игроки уже несколько десятилетий традиционно жалуются на[…]

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

F* — жемчужина зависимых типов

первая часть Неужели F* в этой промежуточной нише такой один? Нет, вот его некоторые конкуренты: — ATS (Applied Type System) — язык программирования для стыковки программного кода с формальными спецификациями. В нём довольно хитро комбинируются[…]

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

Брутальный F*

F* — это функциональный язык (произносится «эф стар»), один из духовных наследников ML, исходно позиционировавшийся для задач автоматической верификации программ, а сегодня довольно успешно применяемый в ряде математических приложений и в качестве универсального языка (примерно[…]

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

Лирическое отступление о литературном метапрограммировании

первая часть Оболочка IDE для Inform 7 включает, конечно, стандартный редактор с поддержкой подсветки синтаксиса, а также возможность схлопывания различных логических секций кода. Но главное, что в нее встроен интерпретатор Z-кода, и дерево игры визуально[…]

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

Антиматематическое программирование игр и Z-машина

Рассмотрим подход, прямо противоположный математическому стилю в программировании (Haskell, Agda, Coq, Idris). Если в последнем случае нам нужно придерживаться в рамках системы типов формализма, доведённого до абсолюта, то в первом случае мы наоборот описываем на[…]

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

Композируем монады

Хорошо известно, что monads do not compose. Почему? Здесь существует известная путаница, когда на практике под композицией ошибочно понимают организацию цепочек вычислений (с помощью bind монады). Bind лишь вытаскивает значение из монады и передаёт его[…]

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

U-комбинатор на Питоне

предыдущая серия То, что мы рассмотрели ранее, либо подходит узкому кругу разработчиков языков, либо интересно исключительно с теоретической позиции. На практике же лямбда-исчисления наиболее интересны, пожалуй, своими комбинаторами. Начнём с U-комбинатора. U-комбинатор — это функция,[…]

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

Функции как числа

предыдущая серия Как определить числа с помощью одних только функций? Строго говоря, мы определяем не числа, известные нам как абсолютные арифметические понятия, а некоторые условные сущности, которые в нашем контексте лямбда-исчислений ведут себя как натуральные[…]

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

Условный формализм МакКарти

предыдущая серия Условные выражения будем конструировать в классическом стиле липсовода МакКарти. В Си имеется тернарный оператор условие ? выражение-1 : выражение-2 В Питоне тоже есть аналог: выражение-1 if условие else выражение-2 Не забывая, что все[…]

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