Я вам привёл пример более-менее осмысленного кода, который показывает, зачем нужны монады (и do-нотация). Развлекаться совмещением этого с заветами классиков (часть из которых не написала ни одной строчки продакшен-кода за последние несколько десятков лет) предлагаю вам самостоятельно.
А, кстати, да
Классики говорят
фундаментальные основы, которыми должен руководствоваться программист
Бро снова соскочил на апелляцию к авторитетам, которую он так активно выискивал в словах других людей. Лол.
только я не вижу здесь вычислений, тем более алгоритма не вижу! По моему это какие-то переименования.
Я надеялся, что имён и типов вам будет достаточно.
Здесь парсится три строки в числа (что может завершиться неудачей), числа из первых двух строк складываются с проверкой на переполнение (что тоже может завершиться неудачей), и потом делятся на третье (что тоже может завершиться неудачей, потому что на ноль делить нельзя). Не совсем в описанном порядке, но попробуйте почитать код, а не только придумать, как написать ответ максимально не по существу.
В чем смысл применения монад этой записи здесь
Сокращают количество кода, который нужно написать для проверок успеха предыдущих шагов. Здесь этого кода вообще нет, собсна.
что она гарантируют, от чего защищают?
Гарантирует тотальность и защищает от того, что проверки забыли.
Когда/при каких условиях (понятно что это примитивная демонстрация) будут работать эти гарантии эта защита?
Эээ, всегда?
Можете написать код на С/С++ который делает то же самое?
std::optional<int> parseInt(std::string_view);
std::optional<int> checkedAdd(int, int);
std::optional<int> divide(int, int);
std::optional<int> doStuff(std::string_view s1, std::string_view s2, std::string_view s3)
{
const auto mn1 = parseInt(s1);
if (!mn1) {
return {};
}
const auto n1 = *mn1;
const auto mn2 = parseInt(s2);
if (!mn2) {
return {};
}
const auto n2 = *mn2;
const auto msum = checkedAdd(n1, n2);
if (!msum) {
return {};
}
const auto sum = *msum;
const auto mn3 = parseInt(s3);
if (!mn3) {
return {};
}
const auto n3 = *mn3;
return divide(sum, n3);
}
Но это уродливо, понятное дело: много лишнего кода, и можно случайно забыть проверку, или проверить не то, или тому подобное.
Есть вариант обкостылять co_await, чтобы добавить сахара, но это хреново оптимизируется компилятором, требует много унылой ручной работы, и композируется даже хуже, чем монады в хаскеле.
Есть ещё вариант сделать всё через and_then, но это будет выглядеть ещё хуже из-за областей видимости, и вы тогда, о ужас, будете пользоваться монадами даже в C++!
Да, именно это. Потому что «всё» я контролировать не могу, понятное дело, и так как в вашем комментарии не было вообще ничего, кроме хихиканья над придуманной вами же «верой в контроль всего», то если это слово из вашего комментария выкинуть, то ничего не остаётся.
Иными словами, в вашем комментарии больше не к чему прицепиться.
в качестве иллюстрации, что у взрослого самостоятельного человека нет необходимости полагаться на кого-то внешнего?
Блин, я специально несколько раз описывал и подчёркивал взаимодействие со внешними людьми во всей этой схеме, и, более того, явно писал, что это взаимодействие добровольно.
Можете, пожалуйста, сказать, с какой громкостью должна хлопать обезьянка с тарелочками в голове, чтобы при чтении фраз
делать [...] ради пользы другим людям
ради [...] ответа от этих других людей
купив [...] страховку [очевидно у других людей/организаций]
оплачивать работу докторов
следит за своей репутацией [очевидно у других людей]
купив на эти деньги [очевидно сделанные другими людьми] солнечные панели, батарею
купив на эти деньги [очевидно у других людей] несколько разных пукалок
выбирая дом в прооружейном районе [среди прооружейных людей, очевидно, а не прооружейных пингвинов или лемуров]
я продаю другим людям
вы пришли к выводу «о, чувак хочет построить свой собственный маленький мирок и не полагаться ни на кого внешнего»? Ответ в децибелах, если можно.
Вам никто не писал, что система должна быть заботливой "папой и мамой"
Человек выше прямо спрашивал, что делать, если нет системы, обеспечивающей жизнь человека (и из контекста следует, что жизнь в ночлежках не считается, а считается гарантированное трудоустройство за выполнение социального ритуала по просиживанию штанов 4-6 лет в специальном заведении).
Кто у нас вообще хоть когда-либо обеспечивает жизнь человека? Обычно мама с папой, обычно первые лет 15-20 (как повезёт). Других таких структур нет. Поэтому всё, что предлагается — создать такую систему, которая была бы как папа с мамой, только на всю жизнь.
например, вам не приходится держать свою армию для защиты от возможной аннексии каким‑нибудь неприятным гособразованием
И в обмен на это государство может запретить мне выезд из страны и отправить меня на фронт вопреки моему желанию, если об аннексии таки зайдёт речь. Делегирование очень быстро сдулось, как речь зашла о практике.
Или государство может зачморить меня на фронт во имя этой аннексии. Тоже не очень спрашивая меня.
Или государство может тратить мои налоговые деньги на то, чтобы платить тем, кто эту аннексию хочет реализовывать.
Или государство может затягивать войну, потому что главгосударственный муж тогда точно остаётся у руля.
Да и вообще, за последние лет пять можно найти минимум пять примеров, когда наличие формальной (или не очень) армии у государства (или не очень) ему не очень помогало от посягательств на аннексию, вызванных массовыми бомбардировками гуманитарных катастроф, или просто полного развала всех институтов (включая частные) и захвата страны «диверсити-джихадистами» под вялый одобрямс прогрессивных гуманистических медиа.
И в обмен на эту псевдозащиту подавляющее большинство государств требует от меня не иметь своего оружия, тогда как ствол (и не один) в каждом доме — это основное средство борьбы (включая превентивную) с врагами внешними и внутренними, как говорят в одной клятве.
Так что не, спасибо, обменивайтесь сами на свою иллюзию защиты.
или вам не приходится бороться с преступностью один на один
Дело Warren v. DC кодифицирует, что у полиции и государства в целом нет обязанности защищать людей. Они просто должны поддерживать порядок «в целом». Собсна, это ровно то, о чём я говорю: полиция существует не для того, чтобы защищать вас или меня, а для того, чтобы у достаточного количества людей была иллюзия, что они платят деньги не зря, и государство ради них что-то делает.
В любом случае, мне с ней всё равно приходится бороться! Преступность есть, это медицинский факт. И почему-то так получается, что чем более «гуманные» политики, чем больше этого делегирования, тем больше преступности, даже если ментов на душу кратно больше.
В Далласе, Остине или Хьюстоне сильно менее безопасно, чем если вы хотя бы немного от них отъедете, несмотря на то, что полиции там дофига. В антиоружейных городах вроде Чикаго, НЙ и тому подобных всё ещё хуже.
Так что не, спасибо, я лучше субкомпакт на поясе на улице и винтовку дома.
Меры [...] система тоже может принимать
Я же не спорю, что она может принимать! Я говорю, что они делают хуже. Даже упомянутые вами:
по безработице («Новый курс»)
…затянувшие выход из Депрессии. Хотели как лучше, получилось как всегда.
Да и чего так далеко ходить? Вон, недавно в Коммифорнии опять бабло распилили, как раз 32 миллиарда (из 170) на соцпомощи:
Analysis shows California EDD fraud at $32.6 billion and counting
Lexis Nexis data analysis says UI, disability and other fraud at $32.6 billion and could be higher
Кстати, кто мешает лично вам и прочим сочувствующим скинуться на постройку дома для бездомных? Зачем для этого государство?
Дальше, по вашей ссылке:
В результате с 2010 по 2015 год количество хронических бездомных в США сократилось на 23 тыс. человек (31%).
31% — это просто враньё. 23 тыс человек — это ближе к 3.1%, а не 31%, потому что бездомных в Штатах было в районе 650 тыщ человек по тем методологиям, по которым в Штатах вообще считают бездомных (и «хронических» там нет, считают обычно бездомных с доступом к ночлежкам и без):
При этом число бездомных падало с 2007-го, как видно по этому же графику, и решения Обамы в 2009-м в лучшем случае не повлияли вообще никак, в худшем — замедлили тренд на падение.
Но замедление (или вообще обращение) тренда на решение проблемы — это вообще стандартное следствие вмешательства государства в социальные проблемы. Соуэлл в «the vision of the anointed» (которую я вам уже вроде рекомендовал) этому посвящает целую главу с конкретными примерами, источниками и статистикой. Настоятельно рекомендую почитать эту книгу.
Кстати, почему в социальной Европе бездомных больше, чем в Штатах? Почему в социальных штатах США (Калифорния, NY[C]) бездомных больше, чем в Техасе?
---
Дальше я просто беру и грепаю свой спецфайлик со ссылками по тегу #shitholes и копипащу более-менее релевантное:
We gave $7B to California for a high-speed rail line and no track was ever laid: ‘Trains to nowhere’
California Democrats can’t make any guarantees that federal taxpayer dollars sent to the state to help with the victims of the fires won’t be used to aid and abet illegal alien criminals evade federal law enforcement.
[помощь при бедствиях зашкаливает]
Three victims who were brutally assaulted in Cleveland are outraged after a judge set their attacker free
[борьба с преступностью цветёт и пахнет]
Funny thing about Oregon is that it’s the capital of sex offenders so Tina Kotek decided to just stop registering them.
[ожидание вашей половой неприкосновенности — это белый супремасизм и корни работорговлеческой Америки, или чё-т такое]
A Los Angeles doctor shut down her clinic after homeless squatters took over the building — and the city did nothing.
[Помощь бездомным, неиронично. Доктора всё равно дофига получают, могут и новое здание купить. Произошло перераспределение!]
A woman was sleeping on the Coney Island F Train when a stranger set her on fire. She burned to death.
The San Diego County Board of Supervisors just voted 3-1 to enact this policy & become a “Super Sanctuary” county, prohibiting all cooperation with ICE, even on serious crimes like rape, & going further than CA sanctuary state law. Republican @jim_desmond only no vote.
[Наверное, вы на самом деле имели в виду защиту преступников от закона, а не защиту законопослушных граждан от преступников]
The Democrat Mayor of Denver, Colorado, issued a statement saying that he will use City Police and citizens to physically block federal forces from deporting illegals.
[Не наверное, а точно]
I was robbed at gunpoint with an assault rifle in San Francisco. Within months, the gunman was diverted and released without charge "in the interests of justice". Within a year, "mayor" @LondonBreed was hanging out with the gunman at an event to celebrate diverted criminals, smiling and posing for photos
[Точно-точно]
Daniel Penny labeled ‘the white man’ by prosecutor at racially charged manslaughter trial
[Когда в синих помойках редкий гражданин таки вступится, то ему от государства трындец. Не преступникам, а добрым самаритянинам, да, и прокурор сделает всё, чтобы суд был заряженным и нечестным.]
Police say riders didn't help woman raped on train. Does the 'bystander effect' explain why? Philadelphia police said riders did not call 911 and instead held their cellphones up in the direction of the assault.
[Да не, какой bystander effect? Просто мало кто хочет стать следующим Дэниелом Пенни.]
A 20-year-old American woman is now on trial for fatally stabbing a 64-year-old Eritrean asylum seeker who was raping her at a train station in Kaiserslautern, Germany, during the previous summer.
[Это я конкретно случай на поезде искал, но на новостях про Западную Европу у меня нет #shitholes, потому что получается масло масляное]
Дальше мне надоело, хотя я прошёлся всего по примерно 10% результатов. И это у меня, кстати, редкий тег, я его далеко не везде ставлю, где он того заслуживает.
Можете, пожалуйста, назвать хотя бы три страны, кроме США¹, где куда-то серьёзно повернули, и в чём этот поворот заключается конкретно с точки зрения принятых и реализованных изменений в законах, правоприменительной практике, и так далее? «Выбрали Мелони, а она почти литералли наци» не считается, потому что мало победить на выборах, надо ещё что-то делать.
¹ США я исключаю потому, что их обсуждение ввиду федеративности и клоунады отдельных судей (вроде «Biden-appointed judge, Maame Ewusi-Mensah Frimpong, has just made a ruling that marks Home Depots, car washes, and other locations where illegals hide as safe havens in LA blocking ICE from making arrests at those locations.») едва ли получится конструктивным.
плохо применимо когда уже есть уйма кода с double, включая C-интерфейсы нескольких разных библиотек
Это внешнее ограничение, не связанное напрямую с темой статьи (что имена важны и делают большинство комментариев ненужными) и моего коммента (что типы важны и делают большинство комментариев ненужными). ИМХО это как-то ближе к «без типов тяжело», чем к «комментарии нужны».
В конце концов, есть js вообще без типов, и там это не работает совсем. Что я делаю? Просто не пишу на js.
я взял простой и компактный случай как иллюстрацию, можно взять менее компактный где система типов всё равно не поможет выразить смысл (ну, или описание типа будет чрезмерно громоздким)
А это было бы интересно обсудить.
Не согласен. Вы решили одну проблему, но создали другую: теперь у объекта нет просто метода Length(), который в 90% случаев можно и нужно использовать как простой аксессор. Оговорка сделана оговоркой для оставшихся 10%.
Для меня это звучит почти как «код, который работает в 90% случаев». Как я узнаю, попадаю я вот здесь вот в 90% или в 10%? Как я узнаю это, проводя код ревью, где комментарии используемых методов не видно? Или вот у меня функция на три уровня выше тормозит, а она дёргает Length, что я не вижу в профайле, потому что заинлайнилось всё три раза — мне идти все комментарии ко всем функциям до каждого листа дерева вызовов теперь смотреть?
Если на это можно забить и это неважный аспект, то, ну, на это можно забить, и комментарий лучше не делает. Если это важный аспект, то есть варианты — заменить это на пару из
(где ComputationWitness конструируется дёшево и/или извне для дешёвых случаев, и связан с тяжёлой работой иначе), или тому подобные вещи, которые я не могу уточнить без знания специфики.
У данного типа - нигде (и нет, его индикатор в данном классе не является уместным), отсюда и предупреждение.
Окей, спрошу по-другому. Какую минимальную проверку мне надо написать перед вызовом Length(), чтобы знать, что он будет дешёвым (и вернуть 0, например, если это не так)?
Не очевидно что лучше. Потому что объектов прорва, а опция variant у них будет одна и та же.
Сорри, не могу разрешить неоднозначность. Объектов, работающих с длинами и их возвращающих, прорва, и если один из них, так получилось, засунул в variant метры, то и все остальные точно будут работать только с метрами и в эти странные юниты не вылезут? Если да, то это как раз значит, что [в мире выразительных типов] все эти штуки должны быть индексированы используемой координатной системой. Тогда вам не нужно никаких конверсий и проверок в рантайме, и всё проверяется компилятором в компилтайме.
Но в подавляющем большинстве случаев настолько сильно перф не нужен, и компилятор вырежет значимую часть проверок после инлайнинга или LTO, и можно спокойно писать с вариантами.
А там, кстати, где перф на самом деле нужен до наносекунд (всякое хфт), я так делаю даже на плюсах. Просто всё становится темплейтом, и у вас будет
template<CoordSystem>
struct CoordSystemTraits
{
using LengthType = Meters;
};
template<>
struct CoordSystemTraits<LocalCoordSystem>
{
using LengthType = ProjUnits;
};
template<CoordSystem S>
using LengthOf = typename CoordSystemTraits<S>::LengthType;
template<CoordSystem S>
class GeoLine
{
public:
LengthOf<S> GetLength() const;
};
Да, всё в хедерах должно быть, да, компилируется неиронично по 5 минут, но если вам нужен перф и более-менее уверенность в коде, то более дешёвых альтернатив нет.
Вообще, кажется, заметная часть моего убеждения что комментарии нужны - что в проекте существуют нелокальные условия, которые влияют на локальные решения, поэтому их приходится выражать (напоминать) текстом.
Это да, но это не комментарии к конкретному месту в коде (именно потому что они нелокальны). Им место в README.md, в папочке docs/, или где-то ещё в подобных отдельных местах.
Если вы программист, то у вас есть две операции — pure : a → m a и >>= : m a → (a → m b) → m b. Первая засовывает чистые данные в монаду, а вторая делает то, что вы описали — берёт монадическое значение и дёргает с ним функцию, которая может возвращать другое монадическое значение.
«Достающая данные из монады» функция вроде extract : m a → a (или → [a], неважно) не существует в общем случае. Чтобы понять, почему, попробуйте написать тотальную функцию extract : Maybe a → a.
А если вы математик, то монада — это эндофунктор T : 𝒜 → 𝒜 с двумя естественными преобразованиями η : 1_𝒜 ⇒ T (которое примерно эквивалентно pure), и μ : T² ⇒ T (которое примерно эквивалентно join : m (m a) → m a, который есть и у программистов, просто менее известен, и через который можно выразить >>=). Ничего про вытаскивание данных (гипотетическое ε : T ⇒ 1_𝒜) тут тоже нет.
Наверное, потому, что ооп не обещает того, чего не может выполнить на практике. Где вы видели, что бы ООП-программист заявлял, что "знает что вернет функция" ?
Я видел, как ООП-программисты заявляли, что ООП обещает «инкапсуляцию» (про что, собственно, и был мой исходный пример, а вы подменяете тезис). Дальше возвращаемся к моему исходному вопросу: насколько адекватным будет ответ на это про то, что можно пропатчить компилятор для игнорирования private?
Хоть в смысле операционной, хоть в смысле денатационной семантики.
Так можно всё-таки узнать, что имелось в виду под вашим «Нет, не знаете! Вы знаете о том, что она не возвращает во внешний мир результатов об этом.» ?
Но проблема в том, что все программы к ним не сводятся. Как правило есть не детерминеированное поведение.
Ну и отлично — у вас получается живущая в IO и работающая с внешним миром маленькая часть где-то в окрестности main, и большая, чистая, тестируемая бизнес-логика с контролем эффектов и прочими радостями. Чему это противоречит?
Вы не поняли что я написал. Я лишь указал, что в любой современной программе есть внешние зависимости, которые вы, как автор своей программы, не контролируете или контролируете слабо.
Не, сорян, это не «вы не поняли», это «я сейчас переобуваюсь в прыжке». Вы прямо написали, что можно пропатчить компилятор (по-видимому, чтобы он не проверял типы как надо). Это совсем не то же самое, что «внешние зависимости [вроде библиотек в привычных мне языках] могут делать произвольную ерунду».
Ну т е произвольную Си-библиотеку вообще нельзя объявить как чистую, верно ? Если верно, то Хаскель - это игрушечная система сама в себе.
Почему? Используете её как нечистую, в чём проблема?
Олсо, за лет пять плотной продакшен-работы на хаскеле мне нужно было подключать сишную библиотеку ровно один раз, когда из соображений совместимости floating-вычислений с другой реализацией нужно было дёргать floating-инструкции из musl. Всё.
Да, никто с этим не спорит
Ну ваще-т нет, вы снова говорите «в случае ООП тоже можно сказать, работает ли библиотека с IO». Нет, не тоже. Это как говорить, что автомобиль ничем не лучше велосипеда, потому что на велосипеде тоже можно доехать от Калининграда до Камчатки. Можно, но обычно ездят на машине, и мало кто из ездящих на машине согласится обменять её на велосипед для этих целей.
И с тем, что это не плохо никто не спорит, просто вы пишите об этом, как о некой гарантии. А это не так.
…не имеет никакого отношения к тому, что я написал, потому что я ничего не писал о контроле всего.
Я писал о том, что единственный человек, который заботится о ваших интересах — вы сам. Делегировать это окружающим — плохая идея. Читать это как «контролировать всё» — плохие навыки восприятия текста в лучшем случае, и осознанная подмена в худшем.
Ну тогда ответьте для себя на вопрос: что делать человеку, если нет системы, которая обеспечивает его жизнь?
Научиться отвечать за себя самому и перестать жить в парадигме, что где-то есть добрые папа с мамой, которые о тебе заботятся ну вот просто потому, что окситоцин N лет назад поработал ну они же тебя любят. Их нет. Вера в то, что можно построить какую-то систему, где левые люди будут достаточно заботиться о тебе просто за факт твоего существования (и будут делать это не под дулом автомата) — это очень приятная, сухая, тёплая и комфортная, но не более чем иллюзия.
Я умею делать какие-то вещи, и мне они интересны. Какие-то другие вещи, недалеко от интересных мне, полезны другим людям. Я заставляю себя делать чуть менее интересные мне вещи ради пользы другим людям, но не просто так, а ради ликвидного и универсального разменного ответа от этих других людей (можете называть его соцкредитом, можете называть измеримым хорошим отношением, но обычно его называют деньгами). Дальше на эти деньги я могу обеспечить свою жизнь. Я могу обеспечить какую-то защиту своего здоровья, купив потом на эти деньги страховку (которая будет оплачивать работу докторов потому, что следит за своей репутацией, а не потому, что у меня красивые глаза и я у мамы самый лучший пухляш с милейшими щёчками). Я могу обеспечить какую-то защиту своего дома от наводнения, сверяясь с FEMA flood maps или им подобными перед покупкой дома. Я могу обеспечить защиту дома от блекаутов, купив на эти деньги солнечные панели, батарею и ещё немного железа. Я могу обеспечивать свою собственную защиту, купив на эти деньги несколько разных пукалок для разных ситуаций и тратя некоторое количество денег на достаточно регулярные тренировки, ну и выбирая дом в прооружейном районе. Я могу балансировать между интересными вещами, долговременными последствиями, и тем, что я в итоге себе обеспечиваю, выбирая, сколько и как своего времени я продаю другим людям, и что я делаю в оставшееся время.
Каждая из этих сделок в пределе ограничена физическими законами (скажем, на Земле конечное число врачей), но если вынести этот неустранимый фактор за рамки, то все эти сделки в пределе абсолютно добровольны.
Вы хотите жить в таком мире?
Конечно же нет. Я хочу жить в мире, где я занимаюсь только интересными мне делами, но у меня всё есть. Я хочу жить в мире, где у меня есть больше, чем у соседа (что приятно щекочет мой обезьяний иерархичный мозг), но сосед мне не завидует потому, что у него больше, чем у меня. В этом мире я могу жрать много вкусной богатой сахаром пищи, и сахар бы конвертировался в мышцы, а не проблемы со здоровьем. В этом мире мне не нужно спать. В этом мире стоит мне открыть дверь, как меня заваливают красивые девчонки, которые млеют от моих рассказов про сопряжённые функторы и расширения Кана.
Но, к величайшему сожалению, совершенно неважно, в каком мире я хочу жить. Важно только то, какой мир реализуем, и как в этом мире я могу достичь каких-то из своих целей. Не все из которых совместимы, кстати — жрать сахар, не заниматься физкультурой и не иметь проблем со здоровьем не получится, например, поэтому придётся не просто прикладывать усилия, придётся от некоторых целей отказываться, или сильно ими балансировать.
Вопрос лишь в том, способен ли и готов ли человек видеть вещи, как они есть, а не как ему хочется.
Как сделать так, чтобы у случайного человека было ощущение что его голос учтён?
Максимизировать децентрализацию. В случае тех же Штатов — около нуля законов на уровне федералов (как оно полагалось изначально, когда федеральная троица властей по большому счёту регулировала только отношения между штатами), возможно чуть больше, но всё ещё около нуля законов на уровне отдельных штатов, и саморегуляция на уровне отдельных county или городов, коих в Штатах достаточно, чтобы самое эффективное голосование — голосование ногами, работало.
РФ, скажем, тоже федерация хотя бы на бумаге, так что тоже что-то такое могло бы работать.
«Честно» — это когда вы обоюдно добровольно обмениваете определённое количество ваших ресурсов (в основном времени) на какие-то нужные вам ништяки (чаще всего деньги)¹. Ключевое слово — добровольно. Поэтому если я ранее поработал с чуваком A, которому понравилось со мной работать, и он поэтому порекомендовал меня чуваку B, то в этом нет априори ничего нечестного.
Но, впрочем, чувствую, что под знакомством вы имели в виду не такие ситуации, а что-то, более близкое к непотизму или притягиванию своих любовниц. Но даже в этом случае нет ничего страшного! Такие компании по идее будут менее эффективны и более паршивы, и работать в них вы и так не захотите. По крайней мере, я не хочу, и не требую у государства (или общества, или любого другого бога) это запретить и не пущать. Я просто не иду в подобные компании, или ухожу из них, когда этим начинает пахнуть.
¹ Впрочем, на следующем уровне размышлений о том, как работают системы, вы поймёте, что понятие честности вообще бессмысленно, и им не нужно оперировать хотя бы потому, что у каждого своя честность. Всё, что важно — какие действия и правила игры приближают интересные вам исходы, насколько хорошо вы способны эту связь просчитать, из какой аксиоматики вы при этом исходите, и насколько эта аксиоматика соответствует реальному миру. Но, судя по вашим симпатиям к централизованному управлению и регулированию, вы пока ещё очень сильно не там, и этот абзац не для вас, а для прочих читателей.
Прекрасный пример. Давайте разбирать, почему комментарии всё ещё не нужны.
//! \brief возвращает длину линии в _метрах_, потенциально затратный вызов
//! \warning в случае местной системы координат длина будет в единицах проекции
double Length(void) const;
возвращает длину линии в метрах
Значит, оно должно возвращать не double, а что-то в духе Meters или Unit<Meters, double>.
потенциально затратный вызов
Length переименовываем в ComputeLength, и затратность уже понятна по имени.
А вообще что такое «затратный вызов»? Там внутри тригонометрия используется, и поэтому оно тормозит, или оно в БД идёт и получает данные о данном пути, и поэтому тормозит (но на несколько других масштабах)? Комментарий об этом не говорит вообще.
И, кстати, в LengthUnits такого комментария нет. Я так понимаю, оно не затратное? Или забыли написать? Непонятно.
в случае местной системы координат
Ничего не понял. Где этот случай торчит в API? Откуда я как читающий этот код в первый раз знаю, где и какой случай подразумевается?
длина будет в единицах проекции
Это почти как stringly-typed code, только doubly-typed.
В плюсах лучше возвращать std::variant<Meters, ProjUnits>, например, и комментарий снова не нужен, и рефакторить-развивать такой код — одно удовольствие.
А в языках с нормальными системами типов мы вообще пишем что-то в духе
LengthType : CoordSystem → Type
LengthType Local = ProjUnits
LengthType _ = Meters
length : (line : GeoLine) → LengthType (coordSystemOf line)
-- или, альтернативно, если имеет смысл
-- индексировать сам GeoLine
-- координатной системой, в которой оно живёт:
length : GeoLine cs → LengthType cs
Ты банальной линейной регрессией даже xor не сделаешь, куда там рекомендации. А всякие там даже базовые kNN — они сильно нелинейные.
И коллаборативная фильтрация будет рекомендовать мне, скажем, Puscifer потому, что я слушал Tool, а Puscifer — сторонний проект вокалиста Tool, хотя стили у них слегка разные, и это мимо для меня лично (но не мимо для фаната вокалиста Tool, откуда эта группа и появилась в рекомендациях). Коллаборативная фильтрация неиронично предлагала «почитайте "как справиться с депрессией", потому что вам понравился "real world haskell"». Коллаборативная фильтрация прямо сейчас мне предлагает
и
хотя в этом нет никакого смысла для меня лично. Я не люблю такую литературу даже в своём fiction-треке, у меня нет никаких подобных высоко оцененных книг, это просто кривой алгоритм (и я не могу ему про это сказать).
У коллаборативной фильтрации нельзя спросить «порекомендуй книги типа Diaspora Игана или Blindsight Уоттса, но книги вроде серии zones of thought Винджа не рекомендуй, потому что там унылая спейс-опера», и коллаборативная фильтрация не даст тебе ответ, почему тебе может понравиться или не понравиться та или иная книга (и ты не можешь это уточнить).
На вопросы вроде «I'm curious to learn about the relation of topos theory and quantum theory, and "A First course in topos quantum theory" is on my to-read list. But my quantum theory is rusty (think a university course 15 years ago), so what would you recommend as a refresher?» коллаборативная фильтрация не отвечает принципиально. А ChatGPT показывает себя вполне неплохо.
Прям противников абортов напомнило.
Если женщина прям совсем против, то ей достаточно не исполнять половой акт.
Я вам привёл пример более-менее осмысленного кода, который показывает, зачем нужны монады (и
do-нотация). Развлекаться совмещением этого с заветами классиков (часть из которых не написала ни одной строчки продакшен-кода за последние несколько десятков лет) предлагаю вам самостоятельно.А, кстати, да
Бро снова соскочил на апелляцию к авторитетам, которую он так активно выискивал в словах других людей. Лол.
Я надеялся, что имён и типов вам будет достаточно.
Здесь парсится три строки в числа (что может завершиться неудачей), числа из первых двух строк складываются с проверкой на переполнение (что тоже может завершиться неудачей), и потом делятся на третье (что тоже может завершиться неудачей, потому что на ноль делить нельзя). Не совсем в описанном порядке, но попробуйте почитать код, а не только придумать, как написать ответ максимально не по существу.
Сокращают количество кода, который нужно написать для проверок успеха предыдущих шагов. Здесь этого кода вообще нет, собсна.
Гарантирует тотальность и защищает от того, что проверки забыли.
Эээ, всегда?
Но это уродливо, понятное дело: много лишнего кода, и можно случайно забыть проверку, или проверить не то, или тому подобное.
Есть вариант обкостылять
co_await, чтобы добавить сахара, но это хреново оптимизируется компилятором, требует много унылой ручной работы, и композируется даже хуже, чем монады в хаскеле.Есть ещё вариант сделать всё через
and_then, но это будет выглядеть ещё хуже из-за областей видимости, и вы тогда, о ужас, будете пользоваться монадами даже в C++!Здесь нет никакой продвинутой математики.
Да, именно это. Потому что «всё» я контролировать не могу, понятное дело, и так как в вашем комментарии не было вообще ничего, кроме хихиканья над придуманной вами же «верой в контроль всего», то если это слово из вашего комментария выкинуть, то ничего не остаётся.
Иными словами, в вашем комментарии больше не к чему прицепиться.
Блин, я специально несколько раз описывал и подчёркивал взаимодействие со внешними людьми во всей этой схеме, и, более того, явно писал, что это взаимодействие добровольно.
Можете, пожалуйста, сказать, с какой громкостью должна хлопать обезьянка с тарелочками в голове, чтобы при чтении фраз
вы пришли к выводу «о, чувак хочет построить свой собственный маленький мирок и не полагаться ни на кого внешнего»? Ответ в децибелах, если можно.
Человек выше прямо спрашивал, что делать, если нет системы, обеспечивающей жизнь человека (и из контекста следует, что жизнь в ночлежках не считается, а считается гарантированное трудоустройство за выполнение социального ритуала по просиживанию штанов 4-6 лет в специальном заведении).
Кто у нас вообще хоть когда-либо обеспечивает жизнь человека? Обычно мама с папой, обычно первые лет 15-20 (как повезёт). Других таких структур нет. Поэтому всё, что предлагается — создать такую систему, которая была бы как папа с мамой, только на всю жизнь.
Так что (особенно с учётом обезьянки и тарелочек)
нет, не умеете.
Какие-то не очень удачные у вас примеры.
И в обмен на это государство может запретить мне выезд из страны и отправить меня на фронт вопреки моему желанию, если об аннексии таки зайдёт речь. Делегирование очень быстро сдулось, как речь зашла о практике.
Или государство может зачморить меня на фронт во имя этой аннексии. Тоже не очень спрашивая меня.
Или государство может тратить мои налоговые деньги на то, чтобы платить тем, кто эту аннексию хочет реализовывать.
Или государство может затягивать войну, потому что главгосударственный муж тогда точно остаётся у руля.
Да и вообще, за последние лет пять можно найти минимум пять примеров, когда наличие формальной (или не очень) армии у государства (или не очень) ему не очень помогало от посягательств на аннексию, вызванных массовыми бомбардировками гуманитарных катастроф, или просто полного развала всех институтов (включая частные) и захвата страны «диверсити-джихадистами» под вялый одобрямс прогрессивных гуманистических медиа.
И в обмен на эту псевдозащиту подавляющее большинство государств требует от меня не иметь своего оружия, тогда как ствол (и не один) в каждом доме — это основное средство борьбы (включая превентивную) с врагами внешними и внутренними, как говорят в одной клятве.
Так что не, спасибо, обменивайтесь сами на свою иллюзию защиты.
Дело Warren v. DC кодифицирует, что у полиции и государства в целом нет обязанности защищать людей. Они просто должны поддерживать порядок «в целом». Собсна, это ровно то, о чём я говорю: полиция существует не для того, чтобы защищать вас или меня, а для того, чтобы у достаточного количества людей была иллюзия, что они платят деньги не зря, и государство ради них что-то делает.
В любом случае, мне с ней всё равно приходится бороться! Преступность есть, это медицинский факт. И почему-то так получается, что чем более «гуманные» политики, чем больше этого делегирования, тем больше преступности, даже если ментов на душу кратно больше.
В Далласе, Остине или Хьюстоне сильно менее безопасно, чем если вы хотя бы немного от них отъедете, несмотря на то, что полиции там дофига. В антиоружейных городах вроде Чикаго, НЙ и тому подобных всё ещё хуже.
Так что не, спасибо, я лучше субкомпакт на поясе на улице и винтовку дома.
Я же не спорю, что она может принимать! Я говорю, что они делают хуже. Даже упомянутые вами:
…затянувшие выход из Депрессии. Хотели как лучше, получилось как всегда.
Да и чего так далеко ходить? Вон, недавно в Коммифорнии опять бабло распилили, как раз 32 миллиарда (из 170) на соцпомощи:
Угу. Принимать.
Audit finds California spent $24B on homelessness in 5 years, didn't consistently track outcomes
Если по-русски: бабло просто распилено.
Кстати, кто мешает лично вам и прочим сочувствующим скинуться на постройку дома для бездомных? Зачем для этого государство?
Дальше, по вашей ссылке:
31% — это просто враньё. 23 тыс человек — это ближе к 3.1%, а не 31%, потому что бездомных в Штатах было в районе 650 тыщ человек по тем методологиям, по которым в Штатах вообще считают бездомных (и «хронических» там нет, считают обычно бездомных с доступом к ночлежкам и без):
При этом число бездомных падало с 2007-го, как видно по этому же графику, и решения Обамы в 2009-м в лучшем случае не повлияли вообще никак, в худшем — замедлили тренд на падение.
Но замедление (или вообще обращение) тренда на решение проблемы — это вообще стандартное следствие вмешательства государства в социальные проблемы. Соуэлл в «the vision of the anointed» (которую я вам уже вроде рекомендовал) этому посвящает целую главу с конкретными примерами, источниками и статистикой. Настоятельно рекомендую почитать эту книгу.
Кстати, почему в социальной Европе бездомных больше, чем в Штатах? Почему в социальных штатах США (Калифорния, NY[C]) бездомных больше, чем в Техасе?
---
Дальше я просто беру и грепаю свой спецфайлик со ссылками по тегу #shitholes и копипащу более-менее релевантное:
[помощь при бедствиях зашкаливает]
[борьба с преступностью цветёт и пахнет]
[ожидание вашей половой неприкосновенности — это белый супремасизм и корни работорговлеческой Америки, или чё-т такое]
[Помощь бездомным, неиронично. Доктора всё равно дофига получают, могут и новое здание купить. Произошло перераспределение!]
[New York City has a brand ©]
[Наверное, вы на самом деле имели в виду защиту преступников от закона, а не защиту законопослушных граждан от преступников]
[Не наверное, а точно]
[Точно-точно]
[Когда в синих помойках редкий гражданин таки вступится, то ему от государства трындец. Не преступникам, а добрым самаритянинам, да, и прокурор сделает всё, чтобы суд был заряженным и нечестным.]
[Да не, какой bystander effect? Просто мало кто хочет стать следующим Дэниелом Пенни.]
[Это я конкретно случай на поезде искал, но на новостях про Западную Европу у меня нет #shitholes, потому что получается масло масляное]
Дальше мне надоело, хотя я прошёлся всего по примерно 10% результатов. И это у меня, кстати, редкий тег, я его далеко не везде ставлю, где он того заслуживает.
Можете, пожалуйста, назвать хотя бы три страны, кроме США¹, где куда-то серьёзно повернули, и в чём этот поворот заключается конкретно с точки зрения принятых и реализованных изменений в законах, правоприменительной практике, и так далее? «Выбрали Мелони, а она почти литералли наци» не считается, потому что мало победить на выборах, надо ещё что-то делать.
¹ США я исключаю потому, что их обсуждение ввиду федеративности и клоунады отдельных судей (вроде «Biden-appointed judge, Maame Ewusi-Mensah Frimpong, has just made a ruling that marks Home Depots, car washes, and other locations where illegals hide as safe havens in LA blocking ICE from making arrests at those locations.») едва ли получится конструктивным.
Это внешнее ограничение, не связанное напрямую с темой статьи (что имена важны и делают большинство комментариев ненужными) и моего коммента (что типы важны и делают большинство комментариев ненужными). ИМХО это как-то ближе к «без типов тяжело», чем к «комментарии нужны».
В конце концов, есть js вообще без типов, и там это не работает совсем. Что я делаю? Просто не пишу на js.
А это было бы интересно обсудить.
Для меня это звучит почти как «код, который работает в 90% случаев». Как я узнаю, попадаю я вот здесь вот в 90% или в 10%? Как я узнаю это, проводя код ревью, где комментарии используемых методов не видно? Или вот у меня функция на три уровня выше тормозит, а она дёргает
Length, что я не вижу в профайле, потому что заинлайнилось всё три раза — мне идти все комментарии ко всем функциям до каждого листа дерева вызовов теперь смотреть?Если на это можно забить и это неважный аспект, то, ну, на это можно забить, и комментарий лучше не делает. Если это важный аспект, то есть варианты — заменить это на пару из
или сделать
(где
ComputationWitnessконструируется дёшево и/или извне для дешёвых случаев, и связан с тяжёлой работой иначе), или тому подобные вещи, которые я не могу уточнить без знания специфики.Окей, спрошу по-другому. Какую минимальную проверку мне надо написать перед вызовом
Length(), чтобы знать, что он будет дешёвым (и вернуть 0, например, если это не так)?Сорри, не могу разрешить неоднозначность. Объектов, работающих с длинами и их возвращающих, прорва, и если один из них, так получилось, засунул в
variantметры, то и все остальные точно будут работать только с метрами и в эти странные юниты не вылезут? Если да, то это как раз значит, что [в мире выразительных типов] все эти штуки должны быть индексированы используемой координатной системой. Тогда вам не нужно никаких конверсий и проверок в рантайме, и всё проверяется компилятором в компилтайме.Но в подавляющем большинстве случаев настолько сильно перф не нужен, и компилятор вырежет значимую часть проверок после инлайнинга или LTO, и можно спокойно писать с вариантами.
А там, кстати, где перф на самом деле нужен до наносекунд (всякое хфт), я так делаю даже на плюсах. Просто всё становится темплейтом, и у вас будет
Да, всё в хедерах должно быть, да, компилируется неиронично по 5 минут, но если вам нужен перф и более-менее уверенность в коде, то более дешёвых альтернатив нет.
Это да, но это не комментарии к конкретному месту в коде (именно потому что они нелокальны). Им место в README.md, в папочке
docs/, или где-то ещё в подобных отдельных местах.Конечно.
Здесь — ни в чём.
Но если у вас код чуть сложнее, с функциями
то код
писать уже несколько приятнее, чем с явными проверками.
Нет такой операции.
Если вы программист, то у вас есть две операции —
pure : a → m aи>>= : m a → (a → m b) → m b. Первая засовывает чистые данные в монаду, а вторая делает то, что вы описали — берёт монадическое значение и дёргает с ним функцию, которая может возвращать другое монадическое значение.«Достающая данные из монады» функция вроде
extract : m a → a(или→ [a], неважно) не существует в общем случае. Чтобы понять, почему, попробуйте написать тотальную функциюextract : Maybe a → a.А если вы математик, то монада — это эндофунктор T : 𝒜 → 𝒜 с двумя естественными преобразованиями η : 1_𝒜 ⇒ T (которое примерно эквивалентно
pure), и μ : T² ⇒ T (которое примерно эквивалентноjoin : m (m a) → m a, который есть и у программистов, просто менее известен, и через который можно выразить>>=). Ничего про вытаскивание данных (гипотетическое ε : T ⇒ 1_𝒜) тут тоже нет.Я видел, как ООП-программисты заявляли, что ООП обещает «инкапсуляцию» (про что, собственно, и был мой исходный пример, а вы подменяете тезис). Дальше возвращаемся к моему исходному вопросу: насколько адекватным будет ответ на это про то, что можно пропатчить компилятор для игнорирования
private?Так можно всё-таки узнать, что имелось в виду под вашим «Нет, не знаете! Вы знаете о том, что она не возвращает во внешний мир результатов об этом.» ?
Ну и отлично — у вас получается живущая в
IOи работающая с внешним миром маленькая часть где-то в окрестностиmain, и большая, чистая, тестируемая бизнес-логика с контролем эффектов и прочими радостями. Чему это противоречит?Не, сорян, это не «вы не поняли», это «я сейчас переобуваюсь в прыжке». Вы прямо написали, что можно пропатчить компилятор (по-видимому, чтобы он не проверял типы как надо). Это совсем не то же самое, что «внешние зависимости [вроде библиотек в привычных мне языках] могут делать произвольную ерунду».
Почему? Используете её как нечистую, в чём проблема?
Олсо, за лет пять плотной продакшен-работы на хаскеле мне нужно было подключать сишную библиотеку ровно один раз, когда из соображений совместимости floating-вычислений с другой реализацией нужно было дёргать floating-инструкции из musl. Всё.
Ну ваще-т нет, вы снова говорите «в случае ООП тоже можно сказать, работает ли библиотека с IO». Нет, не тоже. Это как говорить, что автомобиль ничем не лучше велосипеда, потому что на велосипеде тоже можно доехать от Калининграда до Камчатки. Можно, но обычно ездят на машине, и мало кто из ездящих на машине согласится обменять её на велосипед для этих целей.
И это не так… почему, опять же?
В каких глобальных вещах?
Да, где люди тоже берут ответственность за свою жизнь на себя. Что не так?
…не имеет никакого отношения к тому, что я написал, потому что я ничего не писал о контроле всего.
Я писал о том, что единственный человек, который заботится о ваших интересах — вы сам. Делегировать это окружающим — плохая идея. Читать это как «контролировать всё» — плохие навыки восприятия текста в лучшем случае, и осознанная подмена в худшем.
Научиться отвечать за себя самому и перестать жить в парадигме, что где-то есть добрые папа с мамой, которые о тебе заботятся ну вот просто потому, что
окситоцин N лет назад поработалну они же тебя любят. Их нет. Вера в то, что можно построить какую-то систему, где левые люди будут достаточно заботиться о тебе просто за факт твоего существования (и будут делать это не под дулом автомата) — это очень приятная, сухая, тёплая и комфортная, но не более чем иллюзия.Я умею делать какие-то вещи, и мне они интересны. Какие-то другие вещи, недалеко от интересных мне, полезны другим людям. Я заставляю себя делать чуть менее интересные мне вещи ради пользы другим людям, но не просто так, а ради ликвидного и универсального разменного ответа от этих других людей (можете называть его соцкредитом, можете называть измеримым хорошим отношением, но обычно его называют деньгами). Дальше на эти деньги я могу обеспечить свою жизнь. Я могу обеспечить какую-то защиту своего здоровья, купив потом на эти деньги страховку (которая будет оплачивать работу докторов потому, что следит за своей репутацией, а не потому, что у меня красивые глаза и я у мамы самый лучший пухляш с милейшими щёчками). Я могу обеспечить какую-то защиту своего дома от наводнения, сверяясь с FEMA flood maps или им подобными перед покупкой дома. Я могу обеспечить защиту дома от блекаутов, купив на эти деньги солнечные панели, батарею и ещё немного железа. Я могу обеспечивать свою собственную защиту, купив на эти деньги несколько разных пукалок для разных ситуаций и тратя некоторое количество денег на достаточно регулярные тренировки, ну и выбирая дом в прооружейном районе. Я могу балансировать между интересными вещами, долговременными последствиями, и тем, что я в итоге себе обеспечиваю, выбирая, сколько и как своего времени я продаю другим людям, и что я делаю в оставшееся время.
Каждая из этих сделок в пределе ограничена физическими законами (скажем, на Земле конечное число врачей), но если вынести этот неустранимый фактор за рамки, то все эти сделки в пределе абсолютно добровольны.
Конечно же нет. Я хочу жить в мире, где я занимаюсь только интересными мне делами, но у меня всё есть. Я хочу жить в мире, где у меня есть больше, чем у соседа (что приятно щекочет мой обезьяний иерархичный мозг), но сосед мне не завидует потому, что у него больше, чем у меня. В этом мире я могу жрать много вкусной богатой сахаром пищи, и сахар бы конвертировался в мышцы, а не проблемы со здоровьем. В этом мире мне не нужно спать. В этом мире стоит мне открыть дверь, как меня заваливают красивые девчонки, которые млеют от моих рассказов про сопряжённые функторы и расширения Кана.
Но, к величайшему сожалению, совершенно неважно, в каком мире я хочу жить. Важно только то, какой мир реализуем, и как в этом мире я могу достичь каких-то из своих целей. Не все из которых совместимы, кстати — жрать сахар, не заниматься физкультурой и не иметь проблем со здоровьем не получится, например, поэтому придётся не просто прикладывать усилия, придётся от некоторых целей отказываться, или сильно ими балансировать.
Вопрос лишь в том, способен ли и готов ли человек видеть вещи, как они есть, а не как ему хочется.
Ужасы какие! Что дальше — лицензия на комментарии в интернете?
Пойду задонейчу ещё сотыч в GOA вне очереди.
Максимизировать децентрализацию. В случае тех же Штатов — около нуля законов на уровне федералов (как оно полагалось изначально, когда федеральная троица властей по большому счёту регулировала только отношения между штатами), возможно чуть больше, но всё ещё около нуля законов на уровне отдельных штатов, и саморегуляция на уровне отдельных county или городов, коих в Штатах достаточно, чтобы самое эффективное голосование — голосование ногами, работало.
РФ, скажем, тоже федерация хотя бы на бумаге, так что тоже что-то такое могло бы работать.
«Честно» — это когда вы обоюдно добровольно обмениваете определённое количество ваших ресурсов (в основном времени) на какие-то нужные вам ништяки (чаще всего деньги)¹. Ключевое слово — добровольно. Поэтому если я ранее поработал с чуваком A, которому понравилось со мной работать, и он поэтому порекомендовал меня чуваку B, то в этом нет априори ничего нечестного.
Но, впрочем, чувствую, что под знакомством вы имели в виду не такие ситуации, а что-то, более близкое к непотизму или притягиванию своих любовниц. Но даже в этом случае нет ничего страшного! Такие компании по идее будут менее эффективны и более паршивы, и работать в них вы и так не захотите. По крайней мере, я не хочу, и не требую у государства (или общества, или любого другого бога) это запретить и не пущать. Я просто не иду в подобные компании, или ухожу из них, когда этим начинает пахнуть.
¹ Впрочем, на следующем уровне размышлений о том, как работают системы, вы поймёте, что понятие честности вообще бессмысленно, и им не нужно оперировать хотя бы потому, что у каждого своя честность. Всё, что важно — какие действия и правила игры приближают интересные вам исходы, насколько хорошо вы способны эту связь просчитать, из какой аксиоматики вы при этом исходите, и насколько эта аксиоматика соответствует реальному миру. Но, судя по вашим симпатиям к централизованному управлению и регулированию, вы пока ещё очень сильно не там, и этот абзац не для вас, а для прочих читателей.
Прекрасный пример. Давайте разбирать, почему комментарии всё ещё не нужны.
Значит, оно должно возвращать не
double, а что-то в духеMetersилиUnit<Meters, double>.Lengthпереименовываем вComputeLength, и затратность уже понятна по имени.А вообще что такое «затратный вызов»? Там внутри тригонометрия используется, и поэтому оно тормозит, или оно в БД идёт и получает данные о данном пути, и поэтому тормозит (но на несколько других масштабах)? Комментарий об этом не говорит вообще.
И, кстати, в
LengthUnitsтакого комментария нет. Я так понимаю, оно не затратное? Или забыли написать? Непонятно.Ничего не понял. Где этот случай торчит в API? Откуда я как читающий этот код в первый раз знаю, где и какой случай подразумевается?
Это почти как stringly-typed code, только doubly-typed.
В плюсах лучше возвращать
std::variant<Meters, ProjUnits>, например, и комментарий снова не нужен, и рефакторить-развивать такой код — одно удовольствие.А в языках с нормальными системами типов мы вообще пишем что-то в духе
Ты банальной линейной регрессией даже
xorне сделаешь, куда там рекомендации. А всякие там даже базовые kNN — они сильно нелинейные.И коллаборативная фильтрация будет рекомендовать мне, скажем, Puscifer потому, что я слушал Tool, а Puscifer — сторонний проект вокалиста Tool, хотя стили у них слегка разные, и это мимо для меня лично (но не мимо для фаната вокалиста Tool, откуда эта группа и появилась в рекомендациях). Коллаборативная фильтрация неиронично предлагала «почитайте "как справиться с депрессией", потому что вам понравился "real world haskell"». Коллаборативная фильтрация прямо сейчас мне предлагает
и
хотя в этом нет никакого смысла для меня лично. Я не люблю такую литературу даже в своём fiction-треке, у меня нет никаких подобных высоко оцененных книг, это просто кривой алгоритм (и я не могу ему про это сказать).
У коллаборативной фильтрации нельзя спросить «порекомендуй книги типа Diaspora Игана или Blindsight Уоттса, но книги вроде серии zones of thought Винджа не рекомендуй, потому что там унылая спейс-опера», и коллаборативная фильтрация не даст тебе ответ, почему тебе может понравиться или не понравиться та или иная книга (и ты не можешь это уточнить).
На вопросы вроде «I'm curious to learn about the relation of topos theory and quantum theory, and "A First course in topos quantum theory" is on my to-read list. But my quantum theory is rusty (think a university course 15 years ago), so what would you recommend as a refresher?» коллаборативная фильтрация не отвечает принципиально. А ChatGPT показывает себя вполне неплохо.