TGViewer
Лаборатория Математики и Программирования Сергея Бобровского Лаборатория Математики и Программирования Сергея Бобровского @lambda_brain · 1.41K subscribers
Post #2525 639
Сколько десятков лет я делаю разные учебные материалы, но блин, как же тяжело идёт разбирать теоркат (под обучение кодерам)... Никогда ничего и близко не было по крутости; гомотопическая теория типов, "кубики", calculus of constructions/куб Барендрегта вообще без проблем было сделать обучающие гайды/курсы, но тут ппц...
а всего-то абстрактные кружочки без структуры, и стрелочки между ними )))

Например "универсальное свойство" -- элементарщина для программистов:
есть спека "из таблицы users вынимаем поле id и прибавляем 1, и поле name делаем trim, и записываем соответственно в Id и Name класса User", сам User активно у нас используется в домене как базовая модель. Также спека, как десериализуем из json в Id и Name в User, и т.п.

Так вот, универсальное свойство просто про то, что корректно конвертнуть в плане маппинга полей Id и Name допускается строго одним способом. А если например тимлид скажет: "да пофиг, хочешь для name в Name делай trim, а хочешь нет", это будут два разных способа, и универсального свойства для User уже не будет (и на самом деле из-за этого в проекте могут возникнуть большие проблемы, подумайте почему).

В некотором смысле User -- это идеальный чистый шаблон в нашей бизнес-логике, никак не связанной с внешним миром (как и например Tuple, Task, IEnumerable из стандартной либы), и для его формирования из любого другого типа существует ровно одна уникальная функция. При том, что сигнатура её ничего не говорит о внутреннем устройстве этих типов (но мы можем делать из неё далеко идущие выводы:). И если этой же функцией сформировать Person, то мы можем считать, что Person и User изоморфны.
(Сермяга на самом деле в другом: мы определяем наш идеальный тип только через уникальные функции/стрелки, его формирующие из других типов; а в целом и из него тоже исходят уникальные функции в любые другие типы).


Но когда типы посложнее

Task<Task<int>> nestedTask = ...;

как же трудно пояснить, как это делать (научить как это делать) на C#/Java, чтобы компилятор - система типов - сам отсекал любые способы, отличные от единственно верной стрелки.

c#
Func<Task<Task<int>>, Task<int>> flatten = async outerTask =>
Task<int> innerTask = await outerTask; int result = await innerTask; return result; };


Тут помогает await (универсальное свойство монады), но я могу написать свои ужасающие реализации вроде

Func<Task<Task<int>>, Task<int>> bad = async t => (await t).Result;

которые компилируются, но нарушают асинхронность, теряют данные и исключения, приводят к дедлокам...

...И тут на помощь приходят те самые "Theorems for free".

Сколько таких функций вы можете написать, чтобы компилятор вас не забанил?
Func<T, U, T> f = (t, u) => ???;
Ровно одну :)

Фактически, изоморфизм Карри-Ховарда говорит ровно то, что строгая типизация с дженериками/тотальный параметрический полиморфизм, и теория категорий -- это буквально одна и та же наука, просто записанная разными буковками.

Влюбился прям в теорию категорий ❤️ следом за HoTT ❤️
  • ❤‍🔥 36
  • ❤ 6
  • 🔥 3
  • ⚡ 2
More from @lambda_brain
  1. Sep 28, 2026. Облако драгоценностей за неделю. Дипломный проект разросся уже так, что расширил его до…
  2. Sep 27, 2026GELU (Gaussian Error Linear Unit) -- базовая фича архитектуры трансформеров, да и вообще в…
  3. Sep 27, 2026Продолжение сериала "Совершенно не удивлён, и дальше будет только хуже" (с) На этой неделе…
  4. Sep 26, 2026А вы разве не работаете сейчас (на себя, а не на дядю)?? Потребность в программистах уже в…
  5. Sep 25, 2026Гарри Поттер и Методы Математического Мышления Книга 1. Гарри Поттер и Неорганический Инте…
  6. Sep 25, 2026Свежее от ребят (и девчат). ...Так же было собеседование в Сбере, каким то чудом прошел их…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →