плохо применимо когда уже есть уйма кода с 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 показывает себя вполне неплохо.
человека как пример "умеющего рассуждать" не надо приводить
Если почитать мой комментарий, то можно заметить, что человека (особенно в среднем) я и не приводил как такой пример.
Более того, лично я считаю, что ЛЛМ — это не «смотрите, оно уже почти как люди, общий искусственный интеллект будет уже завтра», а скорее «смотрите, люди в среднем на самом деле почти как предсказатель токенов, естественная глупость уже вчера».
(а не верили бы в любую чушь с раскрытым ртом) не было бы всего того безумия что творится на планете
Мои наблюдения говорят, что чем больше человек считает, что его верования — самые верные верования (не называя их верованиями, конечно), тогда как большинство по тем же вопросам верят во всякую чушь, тем больше он сам верит во всякую чушь.
ЛЛМ не умеют размышлять (что бы это ни значило), но умеют, упрощая, рекурсивно генерировать следующий токен согласно некоторому распределению из обучающей выборки. Поэтому если в обучающей выборке было достаточно текстов с разговорами
на абстрактные, философские, отношенческие и прочие плохо формализуемые темы
то ЛЛМ будет выдавать вполне себе неотличимые локально от людей результаты.
А текстов было достаточно. В интернете этого много, а люди сильно более похожи друг на друга, чем может показаться.
И, кстати, чем хуже оно формализуется, тем более неотличима ЛЛМ от человека (в человеколюбиво-оптимистичном случае; в мизантропо-циничном — тем ближе ЛЛМ к максимуму по людям). На вопросах по теоркату даже топовые модели сливаются очень быстро, генерируя легко проверяемый бред уровня эквивалентности уравнений a + b = c и a = b + c. А вот на вопросах о «порекомендуй книжку почитать, если мне понравилась эта вот поэтому, а вот та не понравилась потому», или «проинтерпретируй текст этой песни», или вообще полный буллшит уровня «основываясь на истории общения и статистике по другим людям и вообще по научным данным, дай прогноз моей жизни на следующие 12 месяцев», оно показывает себя глубже и шире подавляющего большинства людей, с кем я общался.
Плюс, у меня есть впечатление, что вы сравниваете среднее по ЛЛМкам с околомаксимумом по людям. А найти хорошего человека-советчика на все эти вот темы — это, вообще говоря, известная проблема.
Этот код успешно используется десятилетиями, это конечно косвенное и статистическое доказательство, но с такими сроками и объемами вполне надежное.
А потом заголовки
В загрузчике GRUB2 выявлена 21 уязвимость
В библиотеке Libxml2, разрабатываемой проектом GNOME и применяемой для разбора содержимого в формате XML, выявлено 5 уязвимостей, две из которых потенциально могут привести к выполнению кода при обработке специально оформленных внешних данных.
Ник Велнхофер (Nick Wellnhofer), сопровождающий библиотеку libxml2, объявил, что отныне будет трактовать уязвимости как обычные ошибки. Сообщения об уязвимостях не будут рассматриваться в приоритетном порядке, а станут исправляться по мере появления свободного времени.
Уязвимости в пакетах с Kea DHCP и cyrus-imapd, позволяющие повысить привилегии в системе
Уязвимость в KDE Konsole, позволяющая выполнить код при открытии страницы в браузере
Уязвимости в PAM и libblockdev, позволяющие получить права root в системе
Уязвимость в GNU screen, позволяющая выполнить код с правами root
Дальше мне надоело копипастить заголовки из моего фида opennet, фильтрованного по «уязви». Их там дофига (NB размер скроллбара справа):
Но есть и куча книг в которых все конструкции языка С/С++ совершенно разжеваны, то есть напрямую доказаны, разве вы не знаете об этом?
Я боюсь, что вы не понимаете, что такое доказательство.
Если вас не убеждает то, что язык используется для объяснения(!) положений стандартов, то есть этот язык фактически признан аксиоматическим, других аргументов у меня не будет.
Русский язык тоже можно использовать почти как псевдокод для объясенния(!) полжоений стандартов, но это не делает его доказанным.
Очень жаль, что вы выбрали напрочь проигнорировать основной вопрос моего комментария, и так как он составлял 69% моего текста по объёму, то вы точно сделали это осознанно.
вы наверно не поверите, но я в плюсах писал целые функции на ассемблере, плюсы позволяют писать на Ассемблере, поэтому я знаю о чем говорю
«В плюсах можно делать ассемблерные вставки ⇒ сравнение с кодом на плюсах можно подменять на сравнение с ассемблером, в который компилируется код на плюсах или хаскеле». Топовая логика, ничего не скажешь.
Кстати, на хаскеле тоже можно делать ассемблерные вставки и писать на ассемблере целые функции.
Библиотеку с этими функциями потом (после 3 месяцев тестирования) купила одна оченьизвестная контора, возможно они до сих пор где то работают.
Серьёзное достижение для профессионального программиста.
Ваши попытки придать вес вашим словам через подобные никак не связанные с темой обсуждения отсылки вместе с вашей постоянной апелляцией к «а вы авторитет? а вы пытаетесь выдать себя за авторитет? а почему вы так написали, как будто, если очень напрячься, можно подумать, что вы выдаёте себя за авторитета?» складываются в забавную картину.
А, ну для этого любого онлайн-репла достаточно. Я за вас погуглил «haskell online repl» и нашёл второй ссылкой https://tryhaskell.org/, чтобы типы заодно выводились.
Но лучше, конечно, поставить что-нибудь локально, например, через ghcup.
Может дело не в языке, а в том кто его использует? У кого-то лучше получается на плюсах, у кого то на хаскеле, на Джаве, на Тайп-скрипте, ... ?
Мой опыт споров в интернете показывает, что с подобными утверждениями спорить совершенно бессмысленно. На любой мой тезис в духе «на плюсах я профессионально пишу 20 лет, и там и сейчас получается всё хуже, чем получалось на хаскеле с 3-5 годами опыта, и у всех моих плюсатых коллег тоже всё хуже, чем у пишущих на хаскеле, и наблюдаемое мной распределение качества кода сильно не в пользу плюсов» мой собеседник всегда может ответить «skill issue, git gud вы все просто ниасилили» (что даже если arguendo так, то естественный вывод о сравнительном качестве языков от собеседника всё равно почему-то ускользает).
Мне интереснее другое (мне вообще интереснее, как у людей мозги работают, чем конкретные результаты работы этих мозгов — метауровень всегда веселее). Рассматриваете ли вы возможность, что питон/хаскель/жс в практике вас и вашего ближайшего социума медленнее плюсов не потому, что языки объективно тормознутые, а потому, что, ну, дело в том, «кто их использует»?
Собсна, сама дискуссия рядом (где вы ассемблер приплели и на которую сослались в следующем абзаце) показывает, что нет, всерьёз вы такую возможность не рассматриваете. Поэтому мой настоящий вопрос: почему? В чём для вас разница?
вы считаете мои (только мои? или те с которыми невозможно спорить?) аргументы аргументами соломенного пугала :)
Это общепринятый термин для метода спора ведения дискуссии, когда вместо ответа на аргументы собеседника («хаскель оказался быстрее плюсов») вы строите удобный вам аргумент («хаскель оказался быстрее ассемблера, в который он скомпилировался»), вкладываете его в уста собеседника, и потом спорите/высмеиваете/етц именно его, и потому, что выдуманный вами аргумент проще оспорить, или он смешнее, или что-то такое, хотя никакого отношения к исходному он не имеет.
Как ни странно, я считаю только такие подмены аргументов strawman'ами.
Это внешнее ограничение, не связанное напрямую с темой статьи (что имена важны и делают большинство комментариев ненужными) и моего коммента (что типы важны и делают большинство комментариев ненужными). ИМХО это как-то ближе к «без типов тяжело», чем к «комментарии нужны».
В конце концов, есть 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 показывает себя вполне неплохо.
Если почитать мой комментарий, то можно заметить, что человека (особенно в среднем) я и не приводил как такой пример.
Более того, лично я считаю, что ЛЛМ — это не «смотрите, оно уже почти как люди, общий искусственный интеллект будет уже завтра», а скорее «смотрите, люди в среднем на самом деле почти как предсказатель токенов, естественная глупость уже вчера».
Мои наблюдения говорят, что чем больше человек считает, что его верования — самые верные верования (не называя их верованиями, конечно), тогда как большинство по тем же вопросам верят во всякую чушь, тем больше он сам верит во всякую чушь.
ЛЛМ не умеют размышлять (что бы это ни значило), но умеют, упрощая, рекурсивно генерировать следующий токен согласно некоторому распределению из обучающей выборки. Поэтому если в обучающей выборке было достаточно текстов с разговорами
то ЛЛМ будет выдавать вполне себе неотличимые локально от людей результаты.
А текстов было достаточно. В интернете этого много, а люди сильно более похожи друг на друга, чем может показаться.
И, кстати, чем хуже оно формализуется, тем более неотличима ЛЛМ от человека (в человеколюбиво-оптимистичном случае; в мизантропо-циничном — тем ближе ЛЛМ к максимуму по людям). На вопросах по теоркату даже топовые модели сливаются очень быстро, генерируя легко проверяемый бред уровня эквивалентности уравнений a + b = c и a = b + c. А вот на вопросах о «порекомендуй книжку почитать, если мне понравилась эта вот поэтому, а вот та не понравилась потому», или «проинтерпретируй текст этой песни», или вообще полный буллшит уровня «основываясь на истории общения и статистике по другим людям и вообще по научным данным, дай прогноз моей жизни на следующие 12 месяцев», оно показывает себя глубже и шире подавляющего большинства людей, с кем я общался.
Плюс, у меня есть впечатление, что вы сравниваете среднее по ЛЛМкам с околомаксимумом по людям. А найти хорошего человека-советчика на все эти вот темы — это, вообще говоря, известная проблема.
А потом заголовки
В загрузчике GRUB2 выявлена 21 уязвимость
В библиотеке Libxml2, разрабатываемой проектом GNOME и применяемой для разбора содержимого в формате XML, выявлено 5 уязвимостей, две из которых потенциально могут привести к выполнению кода при обработке специально оформленных внешних данных.
Ник Велнхофер (Nick Wellnhofer), сопровождающий библиотеку libxml2, объявил, что отныне будет трактовать уязвимости как обычные ошибки. Сообщения об уязвимостях не будут рассматриваться в приоритетном порядке, а станут исправляться по мере появления свободного времени.
Уязвимости в пакетах с Kea DHCP и cyrus-imapd, позволяющие повысить привилегии в системе
Уязвимость в KDE Konsole, позволяющая выполнить код при открытии страницы в браузере
Уязвимости в PAM и libblockdev, позволяющие получить права root в системе
Уязвимость в GNU screen, позволяющая выполнить код с правами root
Дальше мне надоело копипастить заголовки из моего фида opennet, фильтрованного по «уязви». Их там дофига (NB размер скроллбара справа):
Я боюсь, что вы не понимаете, что такое доказательство.
Русский язык тоже можно использовать почти как псевдокод для объясенния(!) полжоений стандартов, но это не делает его доказанным.
Очень жаль, что вы выбрали напрочь проигнорировать основной вопрос моего комментария, и так как он составлял 69% моего текста по объёму, то вы точно сделали это осознанно.
«В плюсах можно делать ассемблерные вставки ⇒ сравнение с кодом на плюсах можно подменять на сравнение с ассемблером, в который компилируется код на плюсах или хаскеле». Топовая логика, ничего не скажешь.
Кстати, на хаскеле тоже можно делать ассемблерные вставки и писать на ассемблере целые функции.
Серьёзное достижение для профессионального программиста.
Ваши попытки придать вес вашим словам через подобные никак не связанные с темой обсуждения отсылки вместе с вашей постоянной апелляцией к «а вы авторитет? а вы пытаетесь выдать себя за авторитет? а почему вы так написали, как будто, если очень напрячься, можно подумать, что вы выдаёте себя за авторитета?» складываются в забавную картину.
А, ну для этого любого онлайн-репла достаточно. Я за вас погуглил «haskell online repl» и нашёл второй ссылкой https://tryhaskell.org/, чтобы типы заодно выводились.
Но лучше, конечно, поставить что-нибудь локально, например, через ghcup.
Лол.
Мой опыт споров в интернете показывает, что с подобными утверждениями спорить совершенно бессмысленно. На любой мой тезис в духе «на плюсах я профессионально пишу 20 лет, и там и сейчас получается всё хуже, чем получалось на хаскеле с 3-5 годами опыта, и у всех моих плюсатых коллег тоже всё хуже, чем у пишущих на хаскеле, и наблюдаемое мной распределение качества кода сильно не в пользу плюсов» мой собеседник всегда может ответить «
skill issue, git gudвы все просто ниасилили» (что даже если arguendo так, то естественный вывод о сравнительном качестве языков от собеседника всё равно почему-то ускользает).Мне интереснее другое (мне вообще интереснее, как у людей мозги работают, чем конкретные результаты работы этих мозгов — метауровень всегда веселее). Рассматриваете ли вы возможность, что питон/хаскель/жс в практике вас и вашего ближайшего социума медленнее плюсов не потому, что языки объективно тормознутые, а потому, что, ну, дело в том, «кто их использует»?
Собсна, сама дискуссия рядом (где вы ассемблер приплели и на которую сослались в следующем абзаце) показывает, что нет, всерьёз вы такую возможность не рассматриваете. Поэтому мой настоящий вопрос: почему? В чём для вас разница?
Это общепринятый термин для метода
спораведения дискуссии, когда вместо ответа на аргументы собеседника («хаскель оказался быстрее плюсов») вы строите удобный вам аргумент («хаскель оказался быстрее ассемблера, в который он скомпилировался»), вкладываете его в уста собеседника, и потом спорите/высмеиваете/етц именно его, и потому, что выдуманный вами аргумент проще оспорить, или он смешнее, или что-то такое, хотя никакого отношения к исходному он не имеет.Как ни странно, я считаю только такие подмены аргументов strawman'ами.