Pull to refresh
0
Aleksei Matiushkin @chapuzaread⁠-⁠only

Principal Engineer

Send message

Я не понял вопрос, извините. Есть Foldable / Enumerable. Кортеж это, список, или массив — дело сто тридцать пятое.


Если на нем определен fold / reduce — то filter можно определить как показали выше (псевдоязык, haskell, idris соответственно).


Типы элементов — значения не имеют вовсе, главное, чтобы фильтрующая функция их понимала.

Почти все самые популярные лицензии, кроме самой GPL — MIT, BSD, LGPL — ничего не имеют против того, чтобы вы взяли опенсорсный проект и начали его продавать, хоть подточив чуть-чуть, хоть вообще ничего не меняя.


В том и суть.

Оно опционально. Имя пространства → Настройки → Дополнительно (с иконкой-шестеренкой, у меня — последний) → Настройки ввода.


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

Ну так это напрямую зависит от датасета, на котором тренировали. Скорее всего нет, не будет сильной корреляции. Вряд ли их датасет предусматривает случай, когда на комментарий «Я думаю, vim хуже, чем emacs» прилетает -100500 в карму.

сравнить оценку комментария и/или карму автора с его токсичностью

А кто «токсичность» будет выражать в единицах системы СИ? А то я что-то не слышал, чтобы в Палату мер и весов подвезли 1 токс.


Люди, видите ли, разные. То, что вон той снежинке «токсично» — мне забавно, а то, что мне неприятно (я ненавижу само слово «токсично», кстати, потому что его придумали исключительно в целях легитимизации оправданий сливов по тихому в любой дискуссии) — никого не интересует.


Когда мне бьют в морду, все понятно: я просто могу либо дать в ответ, либо утереться и пройти мимо.


Когда человеку пишут что-то крайне ему неприятное и обидное — то все нормально, так и надо, если по мнению большинства оно «не токсично». А если он по запальчивости отвечает без завуалированного хамства, напрямую — набегает толпа и орет «воу, какой токсичный перец!».


Я уверен, что если бы слово «токсично» существовало 85 лет назад, евреев в Германии просто признали бы «токсичными», и это бы узаконило запреты посещенния баров и публичных мест.

Ну вот представьте (правдивая история из жизни одной большой телефонной компании): стоит один пыльный мейнфрейм под VAX/VMS + Oracle8. крутит всяческий учет 600К сотрудников, довольно интенсивный (cobol хорошо умеет именно в трансформации данных, в частности из-за способа их хранения и операций, сводящихся к сдвигу или простому копированию).


Как, а главное зачем это менять на тяжеловесный, перегруженнный, многословный, и тоже уже медленно, но верно устаревающий язык?!

Кобол был первым языком, созданным специально для обработки данных в 1959 году. Грейс Хоппер по праву входит в тройку людей, которые радикально изменили подход к программированию, наравне с Джоном Маккарти (LISP) и Аланом Каем (Smalltalk).


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

Тогда уж


filter' : (fn : a -> Bool) -> List a -> List a
filter' f = foldr (\elt acc => if f elt then elt :: acc else acc) Nil

Вот теперь доказывайте :)

Ну наконец-то!


Спасибо, что заметили. Я, честно говоря, думал, что вокруг так много спецов, что никто и не укажет.


Конечно. Так не только в прод, так вообще никуда нельзя :)

Не выдержал, скажу все таки. Зачем нужно отличать первый элемент от остальных, не понимаю не только я, но и все авторы всех имплементаций filter во всех языках. (Вот, ниже в псевдокоде).


filter(enum, fun) = reduce(enum, new typeof(enum), fn e, acc ->
  if fun(e) then append(acc, e) else acc
end)
outcome switch
{
  { NotFound: { code : 404 } } => ...,
  { NotAllowed: { role : "Admin" } => ...,
};

Чё-как, кто тут эксепшон?

С такими диагнозами в любой приличной конторе завернут по софт скилам.

Да ну? Инфа сотка?


Желаете помериться крутизной контор, в которых мы с вами работаем? Только свистните, я всегда готов.

неудобство человека который раз в полгода что-то посмотрит, с учётом того что он и так язык не знает и ему придётся детально разбираться, может не стоить выгод приобретаемой основной командой

  • человека → всех людей, которые заглянут в код
  • и так язык не знает → не использует язык в режиме 24/7, знать язык он может лучше автора
  • детально разбираться → ровно наоборот, понять структурно и архитектурно
  • выгод приобретаемой основной командой → в случае, если в команду не приходят новые люди, все в команде считают это выгодами и вообще — если эта выгода есть.

документация там «illegal immigrant»

Зависит от культуры, сложившейся в сообществе. У нас в уютном мирке эликсира принято соотношение документация ÷ код ≥ 1.0. Потому что сигнатуры часто недостаточно, чтобы рассказать, как эта функция работает. По сигнатуре не понятно, что, например, случится, если виртуальная машина грохнет этот гринтред из-за переполнения стека его вызовов из других гринтредов.


Для однопоточного перекладывания джейсона это, наверное, оверхед, впрочем.


надо следовать принятым практикам

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


Единственное условие — отходить от практик можно только тогда, когда вы умеете объяснить новичкам, почему тут так, и они с восторгом в глазах с вами соглашаются, как согласились до того действующие члены команды.

Показать мою кого?


Я не хожу по собеседованиям, а осведомленность как-то привык показывать кодом в открытом доступе, холлоффеймами на стековерфло, блогом, конференциями и т. п.


P. S. если меня кто-то спросит «какая сложность должна быть у операций на стеке», я мгновенно переведу разговор на более гуманитарную тему, типа футбола или рыбалки. О разработке я разговариваю только с теми, кто хоть что-то в предметной области понимает.


P. P. S. Кстати говоря, про сложность. Вон там господа в соседних ветках предлагают Левенштайна сложностью O(N×M) — что тоже сразу же нам говорит о том, что господа за деревьями леса ни хрена не видят. Считать расстояние Левенштайна на непомерно длинных строках просто бессмысленно, поэтому ни один профессионал (если он, конечно, не пишет библиотеку, которая умеет только считать расстояние Левенштайна, зато хорошо) — не станет городить огород, и возьмет неоптимальное, зато простое и внятное рекурсивное решение.


А вот если функция вызывается на большом тексте на каждом слове (в цикле, там, например) — то нужно и правда написать библиотеку, O(N×M), с матрицей переходов букв, плохо читаемую, и обложенную бенчмарками. И скрыть ее от использующих этот код за фасадом интерфейса.

Я тут последние полгода-год пользуюсь idea + intellij-haskell, и оно прям рулит и педалит с точки зрения навигации по коду, включая прыжки в библиотеки.

Вы, блин, с каких пор стали дискутировать с тремя случайными словами, вырванными из контекста? Я, вроде, не на эликсире же написал, а на чистом русском, которым вы прям неплохо владеете: писать хаскель легко, спасибо типам и IDE.


Читать, читать без IDE невозможно. При том, что теоретически IDE для хаскеля — нужна чуть поумнее грепа. Оно не приносит никакой вообще обратной связи, кроме навигации.


В идрисе — да, я никогда даже не пытаюсь понимать хоть сколько-нибудь сложный код с экрана, потому что IDE (на самом деле, компилятор идриса, IDE в этой сделке — просто барыга-перекупщик) мне позволит везде, где я споткнулся — вставить дырку и повторить ход мысли автора.


почему в идрисе или агде нет какого-нибудь хуглоподобного поиска

Потому что не хватает рук? Я близок к тому, чтобы самому этим заняться, как только второй компилятор хоть чуточку стабилизируется и превратится в полноценный LS, как первый — нырну.

Ээээ… Спасибо на добром слове.


эффективность решения математических задач в уме vs человеком у которого есть листок бумаги и ручка

Не-не-не. Писать код каждый волен в чем ему удобнее — тут вообще никаких вопросов. Я докопался до «не надо заморачиваться самодукентированным кодом, потому что мне IDE все подсветит», и возражаю с точки зрения читающих код.


Код же читают больше и лучше, чем пишут, так вроде кто-то из великих демагогов сказал?


Так вот прочитать код может потребоваться не только ревьюеру, но и человеку из другой команды, другого отдела, другого года. У фронтендера, который пилит свой гуй в своем любимом ТайпСкриптере, внезапно может не оказаться решарпера. У эрлангиста, который ковыряет сорок два микросервиса, гоняющие туда-сюда миллиарды сообщений — тоже. Но им может потребоваться узнать, как там оно реализовано, для каких-то своих нужд. И они пойдут в GH. Ну, я бы пошел, не знаю.


И вот тут-то и окажется, что документация должна быть first class citizen, а интерфейсу хорошо бы прямо с порога заявить о своей принадлежности племени интерфейсов.


Простой пример: хаскель вон типизирован не в пример лучше шарпа, что как бы должно помогать в IDE найти нужную функцию прям по сигнатуре. Но читать хаскель невозможно, если ты не пишешь на нем 24/7 — из-за дикой мешанины бесконечного количества функций в Prelude и стандартных импортах. Тут так же: вся красота, описанная в статье — write-only. Читателю будет легче, если у интерфейса будет префикс. Точка.

Хороший код всегда красивый, красивый код не всегда хороший.

Отнюдь. Иногда «годный» код от «хорошего» — отличают бенчмарки, и приходится драться за каждую миллисекунду. И вот тут-то красотой приходится жертвовать. Пример из совсем недавнего: писал я там одну библиотеку, и очень красиво хранил внутреннее состояние в AVL Tree. А потом невзначай выяснилось, что удалений в моем случае практически нет, добавления обычно можно свести к конкатенации, а вот поиск прям частый. И я переписал все на связных списках с костылями, дискретным доступом по типу хэшмапа (O(1)) и кодогенерацией matching clauses для частых паттернов. И выиграл в производительности в 10 раз.


Стал ли код менее красивым? — Несомненно. И понять его теперь в двадцать раз сложнее.


И если компилятор языка умеет отличать исключения от ивента, значит и инструмент для работы с этим языком должен и будет их различать.

Возможно. Но я не готов запоминать какой цвет в каком языке какому чему соответствует. В нескольких языках из моего активного словарного запаса понятия «интерфейс» вообще нет (elixir). В других — он означает совсем не то же самое, что в шарпе и джаве (idris).




Или вот исключения и ивенты. Что такое ивент? А в языке с нативной моделью акторов? А в джаваскрипте? А в руби? Синий или зеленый? Курсив или болд? А так-то, для общего понимания кода, мне это все не важно: детали реализации. Мне важно, что автор этого кода считает сие ивентом, что я пойму по ключевому слову Event, а по раскраске не пойму. И если в коде throw new NotifyEvent();, то тут что-то не так, а если throw new Notification(), и Notification красненькое и жирненькое — то я хз.


В общем, с тезисом про то, что код должен доставлять эстетическое наслаждение — я согласен чуть более, чем полностью (с оговорками, конечно, но в общем случае — так). А с тем, что без IDE мне потребуется на понимание в пять раз больше времени, и это нормально — категорически нет.

Пишут — возможно. Но если я начну накатывать по IDE на каждый язык, который мне приходит на CR, я проведу всю жизнь в установке ненужного мне софта.


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


Так что я все-таки убежден, что код обязан не терять в читаемости безо всяких там IDE.

TL;DR: я выстрадал и выкатил 100500 новых правильных практик написания кода: нейминга, форматирования, наследования, инкапсуляции и прочего, но мой код можно понять только изнутри той IDE, которая нравится мне.

по опыту работы с некоторыми аппаратными стэками нет там ни isEmpty, ни size

Ни у какого стека нет size, ему неоткуда взяться и его, главное, негде хранить. empty? легко реализуется через pop, поэтому можно без потери общности считать, что он есть бесплатно.


Ну а Левенштайн — одна строчка кода, если мы говорим про сравнение слов и квадратичный алгоритм годится (рекурсия). Или пять, если нужно добиться O(N×M).


Показательно, что люди хором утверждают, что он сложнее стека, хотя в стеке (который изоморфен аппаратному, а не тупое LIFO), в отличие от Левенштайна, подводных камней полно́. В принципе, признание «Левенштайн сложнее стека» — уже говорит о том, что что такое «сложнее» — каждый понимает по-своему.


основная сложность — это ресайз при добавлении элемента

В стеке, изоморфном аппаратному — такой проблемы нет. См. stack overflow. Это статический массив, а не список.

Information

Rating
Does not participate
Location
Barcelona, Barcelona, Испания
Date of birth
Registered
Activity