На тему вчерашнего разговора про проблемы систем типов. По комментариям и критике у меня осталось ощущение, что я плохо выразил два ключевых момента, и они остались недопонятыми по моей вине. Хотелось бы их постараться все-таки прояснить.
Но прежде всего хочу подчеркнуть, что сам я специалистом в вопросах теории типов не являюсь, и совершенно не претендую на эту роль. Мои мысли носят скорее поверхностный, концептуальный характер, и если я где-то допускаю технические неточности прошу относиться к этому с пониманием.
Я предложил некоторый концепт реализации "утиной типизации" в рамках системы типов. Уважаемые
@Psilon,
@insert_reference_here,
@emmanuelGoldstein и другие участники справедливо указали на то, что при наивной реализации такой подход породит множество двусмысленностей в семантике кода. Это справедливая критика, и концепт нуждается в дополнительном продумывании. Но я хочу подчеркнуть, что он, во-первых, сам по себе не исключает возможности явного объявления именованных типов, например, чтобы специфицировать семантику объектов. Более того, развивая этот концепт в сторону максимизации эргономичности и однозначности интерпретации, мы не обязательно придем именно к моделям и ограничениям на область вывода, например, как в Rust или в Haskell.
Во-вторых, и это более важный аспект на котором я бы хотел особо заакцентировать ваше внимание, важным достижением функциональных языков программирования, помимо того, что они сделали функцию первородным объектом, является ещё то, что они смогли показать, что частичный отказ от принудительного именования всех функций не снижает эргономичности программирования на практике. Напомню, что в своё время это было совершенно неочевидной идеей. Например, в ранние времена в языке Java даже существовали стандарты стиля кода, полностью запрещающие объявление безымянных классов, через которые теоретически тоже можно было выразить "лямбды". Именно потому что они считали такой подход запутывающим код программы. А в современных стандартах мы сейчас уже видим анонимные функции, и это стало нормой. И это было во многом именно заслуга функциональных языков программирования. Одновременно с тем я думаю, что частичный отказ от именованных типов за пределами сигнатур функций и полиморфизма существующих типов, мог бы тоже оказаться полезным. Например, в TypeScript так уже местами разрешают делать.