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

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

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

Java или C++ — это языки, на самом деле, не с сильной, а со слабой/weak типизацией. Другое дело, что для понимания этого момента требуется всё же некий базовый набор математических знаний в теории типов. Так, с помощью Java невозможно выразить некоторые фундаментальные концепции программирования, одна из которых — связывание монадического вычисления. Хотя тема монад — хайповая, многие «программисты» сегодня полагают, что монады (и, следовательно, монадические cвязки) не имеют отношения к их работе, поскольку язык, который они используют, не поддерживает концепцию монад напрямую. И лишь немногие программисты понимают, что на самом деле они действительно используют монады постоянно, просто без языковой поддержки, интуитивно, неосмысленно, и в результате в весьма надуманной и искусственной манере — это всё результат отсутствия формальности в процессе кодирования. В последние версии C# и подобных языков встроена как минимум одна монада, а в общем случае, даже без явного её использования, гуру функционального программирования заявляют, что если прислать им достаточно объёмный проект на сотни тысяч строк кода, то они гарантированно найдут в нём минимум одну монаду на каждую тысячу строк.
То есть, монады чрезвычайно важны в современном программировании и весьма распространенны в мэйнстриме — даже если вы никогда и не узнаете об этом!

Но. Мы не сможем выразить монадическое связывание на языках со слабой системой типов, потому что в них нету типов высших порядков.
Да, в Java 8 появилась довольно искусственная и неуклюжая монада Optional, где в качестве bind выступает flatMap. В результате мы можем избежать длинных условных цепочек .isPresent(), выстроив вместо них линейно связанные .flatMap(). Однако в Java 8 нету например монады Try, в результате толку от flatMap будет немного, если в ходе обработки возможны ошибки. Мы можем конечно добавить Try вручную, однако, увы, публичные API Java спроектированы совершенно по-другому и монады не поддерживают.

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

продолжение

Поделиться статьей ...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Share on VKPrint this page

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *