Читаем http://lambda-the-ultimate.org/, третий год пилим спецификацию своего ИДЕАЛЬНОГО ЯЗЫКА, меряемся системами типов, обоссываем индустриальных петушков. Для затравки:
- boolean - говно уровня goto - весь код должен исполняться в maybe-монаде - ЗА ИСКЛЮЧЕНИЕМ явно указанных мест ну то есть не мейби надо указывать, а его отсутствие, нутыпонел - эксепшены только в виде паники - паттерн матчинг - говно и опционален - если тебе нужно передавать информацию об ошибке caller'у, значит это не ошибка
>>1083869 >>1083912 true\false - артефакт низкоуровнего программирования. Если ты пишешь на си\асм - booleans are ok. Если ты пишешь на высокоуровневом языке - используй сумтайпы\мейби\любую другую подходящую абстракцию.
Можете попробовать придумать хоть один пример, где якобы нельзя обойтись без буленов - поясню, почему это хуевый пример.
>>1083925 > Можете попробовать придумать хоть один пример, где якобы нельзя обойтись без буленов - поясню, почему это хуевый пример. Например, работа с промпротоколами, где булевы сплошь и рядом. Ты лучше сразу ответь, ты из жопы вылез?
>>1083933 Конкретно - реализация протокола Modbus. Этот протокол оперирует понятиями, в т.ч., такими, как "coil" и "discrete input", олицетворяющие собой бинарное состояние некоего электротехнического оборудования. Совершенно очевидно, что программно состояние этих сущностей, с позволения сказать, выражается в виде единиц и нулей. Однако, следуя спецификации, состояние этих сущностей легче всего переложить на булевы типы. Пример так себе, конечно, но таких случаев до фига и больше.
>>1083944 Ну так если у тебя в предметной области, натурально, вылазят булены, то ты берешь и хуяришь себе соответствующий тип из предметной области. Это совсем не то, о чем я говорю. Далеко не каждая программа оперирует понятиями, связанными с электротехническим оборудованием, - а булены почему-то пихают именно что в каждую программу.
>>1083947 Дело говоришь, все типы должны быть связаны с конкретным доменом, а не существовать просто так непойми зачем. Нужны кому-то булены — надо делать свой тип. Нужны кому-то числа — надо делать свой тип. Нужны строки — и снова лучше сделать свой тип.
>>1083953 На самом деле твой сарказм тут мимо кассы. Те же строки постоянно используют неправильно - берут строку вместо даты, вместо урла, вместо константы\кейворда за неимением альтернативы в языке, пихают в строки логи (ну, с этим уже слава б-гу как-то справились, теперь текстовые логи - это скорее мемчик) - ну и так далее.
Насчет чисел - вспомни знаменитую байку про ракетоноситель, который взорвался из-за того, что разные команды использовали разные единицы измерения и никто этого не заметил до релиза. Вроде бы невероятный идиотизм, но оказалось, что и такое бывает - и ведь это в серьезном софте, что уж говорить о всяких оперденях. Зато числа, да.
Все-таки индустрия уже давным давно поняли, что подход "все есть байты" не работает. Просто из-за инертности мышления не все видят, что до сих пор используют этот самый подход. Ну как без буленов, традиция же, везде есть. К тому же это так просто реализовать. Короче, та же история, что с null, один в один.
>>1083990 Ты в логику не можешь? Ифы везде реализуются через паттерн-матчинг. Я считаю, что паттерн-матчинг - говно и должен быть опционален. Найди противоречие, прокариот.
>>1083993 Профессор Карнеги-Мелона, один из известнейших комплюктер сцайентистов, пишет какой-то бред поехавшего. Хотя ничего удивительного для такой борды.
>>1084009 Концептуально я пояснил еще в оп-посте, а что ты имел в виду под "ленивой инициализация" (sic) мне угадывать неинтересно. Ленивая инициализация делается фьючерсами, будены тут вообще никакой жопой.
>>1083985 А попроще нет ничо? Хотя бы как это всё называется? Теория языков? Про опасность нулей только в каком-то треде на реддите про C# видел, и всё. А тут какие-то МОНАДЫ, прочая хуйня, куда я попал.
>>1084016 Так, ты о чем именно спрашиваешь? Вообще, все это в целом называется Computer Science. Конкретно этот тред - про PLT, Programming Language Theory. Монады - это из Type Theory, ну и там категориями заодно можно упороться (за этим ---> /math). Если хочешь просто врубиться, что вообще к чему, какие в языках есть фичи и как надо писать программы - ну классика, htdp\sicp. Плюс познакомься с си, хотя бы одним лиспом, хотя бы одним ML-ем, хотя бы одним фортом. Кругозора от этого за глаза хватит.
Про функциональщину пишут, потому что все эти фишки (от Nullable или LINQ и до дженериков и сборщиков мусора) придумываются в функциональном комьюнити дядечками типа того, на блог которого я ссылку дал, и постепенно мигрируют в мейнстримовые языки с задержкой в пару (десятков) лет. Взять те же лямбды - еще лет десять назад они были только в хаскелях и лиспах, а теперь уже даже в джаву их запихнули. И т.д.
>>1084017 >булева переменная бывает не только истинной или ложной https://en.wikipedia.org/wiki/Boolean_data_type > In computer science, the Boolean data type is a data type, having two values (usually denoted true and false)
> Отвергаешь - предлагай. Предложил в оп-посте и в постах выше, блядь, какой же тупой, скрой этот тред, а лучше вообще никогда не подходи к клавиатуре.
Ладно, как скажешь, закрою тред. Спорить с человеком который не видит разницы между булевом типом данных и переменной - трата времени. Булева переменная бывает не инициализированной, это третье состояние control-flow.
> Про функциональщину пишут, потому что все эти фишки (от Nullable или LINQ и до дженериков и сборщиков мусора) придумываются в функциональном комьюнити
>>1083925 > Можете попробовать придумать хоть один пример, где якобы нельзя обойтись без буленов - поясню, почему это хуевый пример. def userExists(email: String): Future[Boolean]
>>1083925 >Можете попробовать придумать хоть один пример, где якобы нельзя обойтись без буленов - поясню, почему это хуевый пример. Ну например в моей числодробилке есть громоздкое логическое выражение, в которое некоторые подвыражения повторяются. Я хочу взять такие выражения, вычислить их, и присвоить булевым переменным, заодно дав им осмысленные имена, а потом использовать булевы переменные в выражении. Как это делается без булеанов?
>>1083995 Уёбище, пиши нам пример control flow без единого if-а или pattern matching, а не языком чеши. Хотим посмотреть с посонами на достижения науки.
>>1084029 Сука, или не съебался?! Нахуя ты сюда фьючер влепил, если оно на суть в контексте этого разговора никак не влияет? Ну да ладно.
Смотри. Есть несколько вариантов исправления: - Возвращать явный флаг, типа User.EXISTS | User.DOES_NOT_EXIST. Так мы сохраняем контекст и явно в типах кодируем информацию о бизнес-логике. - Возвращать Maybe User = Some User | Nothing. Это стандартный и очевидный вариант. Сейчас ты начнешь кукарекать, что ой-ой, зачем грузить юзера, нам же только проверить - ну так если у тебя в языке нормальная, то ничего и не будет грузиться, пока ты явно не залезешь внутрь Юзера и не вытащишь оттуда что-нибудь. Так что это полностью аналогичный код.
Есть еще один вариант, о котором я говорил в оп-посте, сейчас и его опишу.
>>1084039 >дав им осмысленные имена Так какое именно у тебя логическое выражение? Ты сравниваешь что-то, или что? Или у тебя там именно нулики с единичками числодробятся? Опиши конкретнее.
>>1084046 >control flow Вообще, явный контрол флоу - для байтослесарей. Но это так, food for thought.
На твой вопрос есть ответ в оп-посте, но так уж и быть, поясню еще раз. Все вычисления у тебя в мейби. Вычисление может быть либо успешным, либо нет. Предикаты либо возвращают свой аргумент (быть может, с суженным типом), либо фейлятся. Вот тебе и контрол флоу.
Ну а вообще, если тебе еще примеров именно контрол флоу без ифов надо, то погугли про nand gates на досуге.
div-by-3? имеет тип вида ( Num -> (Num + 'div-by-3)? ). То есть оно возвращает свой аргумент со статическим тегом либо фейлится. a | b полиморфна по правому аргументу: если он может зафейлить, то вся конструкция либо возвращает первое незафейленное значение, либо фейлит; если нет - то конструкция возвращает левое значение, если оно не зафейлило, и правое в противном случае. => - это не кондишнл, а обычная аппликация: берем левый аргумент и применяем к нему правый аргумент, ну либо фейлим, если левый аргумент может зафейлить. str : Num -> Str, any? всегда возвращает свой аргумент без дополнительных тегов и никогда не фейлит.
На самом деле там все немного сложнее, конечно, но основную идею можно уловить и из такого объяснения на пальцах.
кококо, чем это отличается от буленов Тем, что предикаты вида is-foo? возвращают значение типа Foo (либо фейлят и уходят на другой экзекьюшн патх).
>>1084078 > типы > Ruby Поделил на ноль. Сама идея ("хорошие данные пускаем по этому пути, плохие - по тому") так же стара, как программирование вообще. Этот конкретный руби-сахарок вдохновлялся манатками, которые в программирование везде - это один из базовых паттернов, блеать.
Но это абсолютно не то, о чем я говорю. У меня - вариация на тему Occurence Typing (https://docs.racket-lang.org/ts-guide/). Ну хуй знает, я так понимаю, человеку, который не знаком с тем, как все это работает, разница не особо видна - тут уж хз что поделать.
>>1084063 харош уже абстрагироваться >предикаты вида is-foo? все верно, если это привести к конструкция if(foo) никто не возражает? то foo все равно занимает 1 байт(1 или 0), как и bool(true или false)
>>1083857 (OP) >- весь код должен исполняться в maybe-монаде >поясняй Поясняю: виабушный PLT-щик сломался перед фактом, что тьюринг-полный язык не может быть тотальным и решил выразить частичные функции через мейби-манду, да еще сделать это умолчанием, сделав тем самым серьёзный шаг от кодов возврата в сторону переизобретения непроверяемых исключений.
>>1084047 >Возвращать явный флаг Который изоморфен Boolean. А потом что - пилить для него инстанс HeytingAlgebra, да? Короче, ты предлагаешь бессмысленно поебаться на ровном месте, хотя можно например сделать newtype обертку. И получить одни инстансы бесплатно, а другие заменить на свои. Паттерн-матчинг правда страдает, но ты ж говоришь он не нужен. >>1084294 >сделав тем самым серьёзный шаг от кодов возврата В богом данном х-ле и так везде боттом воткнут, какие коды возврата.
>>1084294 Еще один, блядь. Ну ПРО ДРУГОЕ ЭТО СОВСЕМ, хули вы со своими тотальными функциями пристали. >>1084063 оккюренс тайпинг алё не читай @ отвечай.
По поводу кодов возврата > - если тебе нужно передавать информацию об ошибке caller'у, значит это не ошибка и непроверяемых исключений > - ЗА ИСКЛЮЧЕНИЕМ явно указанных мест > - эксепшены только в виде паники
>>1084333 >Который изоморфен Boolean. Аргумент уровня "все равно ж все в байтики компилируется))". Алсо, я же привел 3 (три) разных способа решения этой проблемы, как бы намекая, что в одних случаях лучше подходит один, в других - другой.
>>1084334 2 > 3 ето в идеальном случае `(Number, specifically: 2 | (> 3))?`, где намба - генерализованный тип, 2 - конкретный, (> 3) - параметризованный тайптег, x? - значение типа икс, которое может зафейлиться
>>1084360 >2 > 3 ето в идеальном случае `(Number, specifically: 2 | (> 3))?`, где намба - генерализованный тип, 2 - конкретный, (> 3) - параметризованный тайптег, x? - значение типа икс, которое может зафейлиться За такое нужно сжигать живьем.
>>1083953 >все типы должны быть связаны с конкретным доменом Именно так. Для каждой единицы размерности должен быть свой тип, чтобы не складывать метры и килограммами. То есть у тебя CoilState должено быть задано отдельным типом-перечислением, а не булевой переменной.
>>1084355 >Мне показалось очевидным и излишним добавлять div-by-3-and-5? кейс, тебе так не кажется? Так в этом всё фишечка, браток. Люди простые написали бы (div_by_3(i) && div_by_5(i)). А ты что предлагаешь? Плюс сами "div-by-x?" у тебя не определны. Гонору много, а конкретики мало. Ты нам полностью весь код напиши, чтоб без недомолвок.
>>1084371 >Именно так. Для каждой единицы размерности должен быть свой тип, чтобы не складывать метры и килограммами Ты реально шизик. Большинство величин -- безразмерные. Вот ето выражение какой тип имеет? Нет, так-то да, я тайпдефлю подо всё отдельно всегда, но ты же шизик
>>1084456 >Ты реально шизик. Большинство величин -- безразмерные. Только если ты решаешь абстрактные математические задачи. ИРЛ всегда ясно где сила тока, а где скорость. Шизики из минобороны США в Аде, например, явно прописали возможность делать type Mass is digits 7 range 0.0 .. 1.0E35;
>>1084364 Плебсу слова не давали. Ангуляра наверни, лошара.
>>1084422 Ну подумай сам хоть немножко головушкой, ты же не на лекции. Вот оператор, который возвращает первый валидный аргумент или фейлится, у тебя уже есть. А тебе нужен комбинатор, который берет два предиката и значение, и возвращает значение, если оба предикаты успешны, или фейлится, если хотя бы один предикат фейлится. Ну написал бы я (div-by-3? fn/and div-by-5?) - тебе бы от этого понятнее стало? Нет, не стало бы.
>>1084534 > типы ненужны Окай, оно и без типов интересно, ибо позволяет сократить код. Ну и вообще, пусть расцветают тысячи цветов, все дела - смолток охуенный, но я не смолток.
>>1084530 >Ну написал бы я (div-by-3? fn/and div-by-5?) >Ну использовал бы я обобщенную функцию, оперирующую значениями, реализующими интерфейс Boolean >Ну использовал бы я булены, только не называя их буленами
Мало того, что твоя попытка абстрагироваться от практической применимости не слишком-то осмысленна, так еще и огрызаешься на все "неприятные" фразы. Это явно говорит о том, что твоя позиция недостаточно проста. Попробуй-ка написать хоть одну серьезную программу в правильно-пуристском стиле. Или напиши конпелятор, который такой стиль навязывает. Посмотрим, как запоешь после этого.
Впрочем, можешь не тратить на это время, все равно результат предсказуем. Главное, отучайся хамить. Даже на двачах такое поведение выглядит глупо.
>>1084539 >Попробуй-ка написать хоть одну серьезную программу Потрясающее по своей глубине непонимание контекста. Мы тут обсуждаем Programming Language Theory, а не написание оперденей на джаве. Это примерно как приходить к математику и говорить: "попробуй-ка спроектировать хоть один мост своими гамалогиями, посмотрим, как запоешь после этого))"
Канпелятор пишу потихоньку, но тред вообще не об этом.
> отучайся хамить Во-первых, это интернеты, здесь могут и нахуй послать так что иди нахуй с такими предъявами. Во-вторых, я отвечаю ровно в том тоне, в каком был написан тот пост, на который я отвечаю: за братка и гонор - подумай головушкой, за сжигать живьем - хуй соси, ну и так далее. Но подобные темы лучше обсуждать в /soc или еще где-то, а тут тред про программирование, мммкей?
>>1084539 Так мы ж люди от технологий далёкие. Ты всё корабли космические в Большом, а нам конкретики бы. Хотим fizz-buzz увидеть целиком и полностью без всяких додумок. Метни уж бисеры перед свиньями, вашблагородие.
>>1084546 >Это примерно как приходить к математику и говорить... Нет, это примерно как спрашивать математика "зачем ты пришел на завод рассказывать про симплекс-метод? Профит в чем?". Если математик говорит: "смотрите, вот классическая задача раскроя металла; применим ее решение на нашей линии — сократим расходы на X%" — все отлично, к его мнению надо прислушаться, и даже конкретное решение требовать не обязательно — считать и сами умеем. Если же математик отвечает в духе "ну это же важная тема для повышения производительности труда, вы просто ничего не понимаете" — лучше отправить этого математика к станку, пусть продемонстрирует повышение своей производительности более приземленным способом. Пока что ты накидал тезисов, ценности которой не видно, а их верность — сомнительна.
>а тут тред про программирование, мммкей? Так и пиши то, что относится к программированию, а не выплескивай свой негатив вместо конструктивного и корректного ответа. Ты ведь пришел про PLT рассказывать, а не свое превосходство в хамстве показывать.
>Во-первых, это интернеты, здесь могут и нахуй послать Так и иди нахуй, если не понимаешь, что смешение академического апломба с гопничьими ответами выглядит глупо.
>>1084532 Если бы писал - увидел бы что код - параша получается. Потому что идеи - параша (как любое подражание). Вот это я хотел сказать, но ты ведь не услышишь.
>>1084557 > без всяких додумок На каком языке, але? Я объясняю идею с помощью псевдокода, а ты просишь "без всяких додумок". У тебя только конкретное мышление, как у обезьянок всяких, или что? В чем твой вопрос, что конкретно тебе не понятно?
>>1084562 >Профит в чем? КАК ЭТО УВЕЛИЧИТ НАДОИ ЧУГУНА?! В ЧЕМ ПОЛЬЗА ДЛЯ НАРОДНОГО ХОЗЯЙСТВА?!!
Ну пиздец просто. Математика, если ты не в курсе, - это вещь в себе. Она принципиально не дает и не должна давать никаких "профитов", и никакими "профитами" математики в своей работе не руководствуются. Но доска про математику ---> /math вон там, а мы тут программирование обсуждаем.
Ну и да, если тебя не прет от открытия новых абстракций, паттернов и моделей выполнения, то возможно ты ошибся доской\профессией. Ну, это так, к слову.
>>1084562 >вместо конструктивного и корректного ответа Ответа на что? Где в этом >>1084539 посте вопрос? Процитируй.
На твой вопрос я как раз ранее ответил, но вместо уточнения непонятных моментов ты начал ныть про ой-ой-ой, как же так, мне на харкаче нахамили. Пиздец просто. Обсуждайте изящные манеры в /cul, а тут доска про программирование, тред про PLT.
Давайте еще раз все вместе: нечего сказать по теме треда - завали ебало.
>>1084047 > User.EXISTS | User.DOES_NOT_EXIST Ага, а теперь представь, что у меня есть 2 метода f1 и f2, которые вместо boolean возвращают какие-то свои union типы из 2х значений, и я хочу проверить, условие f1(...) && f2(...)
>>1084357 >Аргумент уровня "все равно ж все в байтики компилируется))" ну если пойти еще дальше, то иожно заметить, что оно еще и в инструкции ассемблера транслируется > https://ideone.com/kYuGCy покормил
>>1084584 Ну вот если бы ты с этого сразу начал, а не брутфорсил в поисках чего-нибудь эдакого - был бы совсем другой разговор. ^_^
По порядку: x % n == 0. Во-первых, == должен быть предикатом, то есть иметь иметь тип (x->x?), то есть быть partially-applied с корректным порядком аргументов. Назовем его eq?, чтобы не путать. Во-вторых, с нулем мы сравниваем остаток, то есть производное от того аргумента, к которому применяется наш предикат. Поэтому надо явно указывать, что возвращаем. Получается: div-by? x n = (x % n) eq? 0, returning x
Впрочем, есть и другой вариант: принять, что все функции работают с таплами, и фейлить тапл целиком. Это хорошо подходит для функций с несколькими возвращаемыми значениями - тогда можно заиметь настоящий ==, например, который возвращает оба своих аргумента. Алсо, тогда можно условиться, что предикаты всегда возвращают свои (неизмененные) аргументы, но для нормальной реализации придется обмазываться еще и линейными типами.
>>1084650 Так х - это конкрит тайп, а не тег. Теги - отдельная хуйня уровня эффектов. Я ее тут вообще не использовал, чтобы трехэтажный тип не городить.
Конечно, в идеале они отдельной хуйней быть не должны, но там оче много ебли + надо сразу иметь в виду, в какой минимальный набор операций все это говно будет раскрываться, а я о базе даже не думал еще особо.
Хотя может и должны. Тут вообще много разных интересных вариантов.
>>1084654 >Я ее тут вообще не использовал, чтобы трехэтажный тип не городить.
Наверное, стоило бы, потому что пока со стороны это выглядит как махание руками или действия тех шизиков, которые в последовательности Pi ищут цитаты из Библии.
>>1084673 Если ( (x -> x?) (x -> x?) -> (x -> x?) ) для тебя выглядит как цитата из Библии, то я даже не знаю, чем тебе помочь. Поспрашивай в ньюфаг-треде.
>>1084063 >берем левый аргумент и применяем к нему правый аргумент Из этого объяснения я понял, что сначала мы считаем (_ -> "fizz")(div-by-3?) а потом применяем результат к числу, то есть ((_ -> "fizz")(div-by-3?))(42) Подозреваю, что это неверно, и порядок вычисления всё-таки другой: (_ -> "fizz")(div-by-3?(42))
>>1084355 >Мне показалось очевидным и излишним добавлять div-by-3-and-5? кейс, тебе так не кажется? Ты не понял ситуацию. Мы тут собрались чтоб те в рот нассать. Первую порцию ты получишь когда напишешь код физбаза полностью за многословность по сравнению даже с императивными вариантами. А вторую за неэффективность, потому что проверка делимости у тебя в общем случае выполняется 2 раза.
>>1084725 щас бы в сиговне о таких тонких материях думать, ага
Ну вот у тебя, если судить по именам, каноничный пример мизюза буленов. Вместо "булеан БэдКласс" надо писать Класс.Бэд, вместо булеан йоурс - писать Оунер = оунерс.ми, оунерс.аи, оунер.вася.
Код я не смотрел, если что, но идею ты понял.
>>1084737 А надо было гуглить effect types, дурашка.
>>1084739 Порядок вычисления в итоге получается как раз такой, как ты ожидаешь. Просто считай, что это все комбинаторы. f => g берет две функции и возвращает функцию, которая сперва применяет f, потом применяет g. Ну и так далее.
А скобочки сам можешь расставить, да. У => тут приоритет выше, чем у |.
>>1084762 Можете попробовать придумать хоть один пример, где якобы нельзя обойтись без буленов - поясню, почему это хуевый пример. @ Приводи конкретный пример конкретного кода - поясню, где ты неправ. @ Код напиши, инфузория. @ Опиши конкретнее. @ Код я не смотрел, если что
>Вместо "булеан БэдКласс" надо писать Класс.Бэд, вместо булеан йоурс - писать Оунер = оунерс.ми, оунерс.аи, оунер.вася. Пересиль себя и напиши псевдокод. Что такое Класс, что такое Оунерс, как записать вычисление класс и оунер, чтобы повторить логику сишного кода. Вангую что получится многословно и уродливо.
>>1084762 Андрей, я в курсе насчет effect types. Правда, непонятно к чему ты пернул про них. У нас все же не гуманитарное обсуждение, упоминание их не к месту и метафорами не прикроешься.
>>1084546 >Мы тут обсуждаем Programming Language Theory Это вы тут, батенька, думаете что обсуждаете теорию, а мы наблюдаем разбрасывание какашками. Если твои наблюдения настолько важны как ты думаешь, и если твое мнение имеет хоть какие-то основания кроме завышенного самомнения, ты постараешься его донести в ясной, простой и понятной форме. Если нет - ну и ладно, мало ли сумасшедших.
>>1084778 Если вы в универе еще не проходили энумы, то это твоя проблема, а не моя. Бесплатно читать тебе лекции по очевидным вещам лично мне неинтересно.
>>1084871 Бла-бла-бла. Съеби с треда\доски, раз тебе нечего сказать по делу.
>>1085170 Поэтому я и сказал выше, что пишу без этой срани. Если хочешь в этой срани разбираться - гугли occurence typing, гугли intersection\union types, читай тред короче, выше уже все говорил.
>>1084915 >энумы Ты не сказал что это энумы. Твой кусок кода может значить что угодно, в том числе обращение к полю/методу объекта или вызов маняоператора "." с произвольной семантикой.
Какие выгоды даёт предложенная тобой замена "badclass" на "class == Class.BAD"? Добавилась статическая проверка того, что типы у class и Class.BAD одинаковые? Охуенно, но в исходном варианте этого расхождения не могло быть в принципе. Может теперь мы не сможем ошибочно заменить это выражение на другое, потому что выражение содержит внутри себя типизированные значения? Нет, ведь значение class мы нигде дальше не используем, а значит вместо "class == Class.BAD" могло быть любое другое выражение, и компилятор был бы столь же доволен. В итоге мы объявили энум, заморочились с присвоением значений этого энума переменной, в нескольких местах повставляли вместо одного идентификатора "badclass" целое выражение "class == Class.BAD", и не выиграли ничего, а наоборот заметно проиграли в лаконичности, теперь у нас четверть сорцов это объявления энумов, а вхождения булеанов заменились на одинаковые, повторяющиеся выражения.
ЧСХ единственная попытка привести конструктивный аргумент в статье Boolean Blindness связана с тем, что внутри pred надо повторно проверить уже проверенное условие. То есть по мнению автора статьи так делать вроде как плохо. Но ты делаешь ровно это же в своём физзбазе, и это вроде как ок >>1084764 Одному и тому же явлению ты даёшь разные оценки, замечал за собой?
Работаем дальше. Что делает адекватный программист с повторяющимися выражениями в коде? Вычисляет один раз и присваивает переменной. Какой тип будет у переменной в нашем случае? Хм, шизик-автор спецификации языка запрещает булеаны, хм, а давайте тогда определим тип, значениями которого могут быть только две функции от туплов: first и second. И определим несколько функций от значений этого типа, таких как and, or, not, xor, impl, ... Отлично, теперь нет проклятых булеанов, можно вздохнуть свободно. Падажжи ёбана, но ведь этот новый тип ничем от булеана не отличается, так нельзя, стираем. Но снова повторяющиеся выражения, неудобно писать стало. Щя по-другому попробуем выразить логические паттерны. Сука, опять в этих абстракциях типы выражений оказываются не к месту и игнорируются...
В конце концов каждым пользователем языка будет на коленке написана своя реализация, а на фразу НЕ ЮЗАЙТЕ БУЛЕНЫ ПЛИЗ в спецификации будет положен болт. Большое количеством несовместимых реализаций булеанов - единственное чего можно добиться исключив их из стандарта.
>>1085307 Дружок, а >boolean - говно уровня goto >паттерн матчинг - говно >если тебе нужно передавать информацию об ошибке caller'у, значит это не ошибка это не >гуманитарное нытье ?
Пиздос просто, попросили пояснить за ОП-тезисы - слился и пообещал обосрать код с булеанами, дали код - слился, попросили написать физзбазз - написал половину и слился. PL-теоретик уровня /pr/.
>>1085312 Нет, это не нытье, а тезисы, за которые я пояснил выше по треду. Код с буленами обосрал выше по треду. Физбаз написал, если ты не смог распарсить псевдокод - твои проблемы, на все вопросы по его поводу я ответил. Если ты не знаешь, что такое map, - твои проблемы, опять же.
Ну как бы ладно, мне следовало бы проявить хоть какое-то УВАЖЕНИЕ к тому времени, которые ты потратил на печатание своей простыни, чтобы не выглядеть со стороны троллем. Но понимаешь, лично для меня нет разницы, написал тут анон "мамку твою ебал" или запостил страницу из сочинений Оскара Уайлда - и там, и там ровно ноль информации по теме треда, так что обоих авторов можно (и нужно) смело посылать нахуй.
Но раз уж я сегодня добрый, то давай отвечу такой же портянкой.
> Какие выгоды даёт предложенная тобой замена "badclass" на "class == Class.BAD"? Какие выгоды дает замена 0x4523452 на &user_name? Ну не знаю, подумай сам, зачем вообще люди придумывают имена и изобретают типы.
Дальше ты вообще хуйню какую-то пишешь. Давай еще раз, для дебилов, почему is_class_bad в общем случае плохо: 1) Нерасширяемо. Если понадобится добавить нейтральный, халяльный или еще какие-нибудь классы - соснешь. 2) Неабстрактно. Детали реализации вытекают наружу. 3) Непроверяемо. Сумтайп компилятор проверяет, а сишный булеан ты, вообще говоря, можешь запихнуть любое вынутое из залупы число.
Все это написано в любой книжке по программированию для чайников. Ты вообще читал хоть что-то про разработку софта? Судя по слогу, ты старшеклассник\студент - ну так читай htdp с sicp'ом, пока время есть, а не сри в абучанах, ну?
> попытка привести конструктивный аргумент в статье Boolean Blindness ЧСВ до небес. Так и представляю, как читает прыщавик какой-нибудь пейпер Тьюринга или Черча и говорит: "ну одна попытка привести конструктивный аргумент вроде кое-как есть))" Очень смешно. На будущее: если ты чего-то не понимаешь, то проблема обычно в тебе.
> Что делает адекватный программист с повторяющимися выражениями в коде? > Вычисляет один раз и присваивает переменной. Без комментариев. Городскую олимпиадку хоть выигрывал на своем паскале, адекватный программист?))00)
> значениями которого могут быть только две функции от туплов: first и second Я не ебу, откуда ты это высрал. Перечитай тред еще раз и попытайся понять хоть что-то из того, что там написано. Задавай конкретные вопросы, когда что-то непонятно.
> функций от значений этого типа, таких как and, or, not, xor, impl, fn/and - это комбинатор, дебил. Погугли, что это такое. Блядь, я ведь даже тип написал, причем хуй знает сколько раз.
> в спецификации В какой спецификации, долбоеб малолетний? ПРЕДИКАТЫ ВОЗВРАЩАЮТ СВОЙ АРГУМЕНТ - что тебе в этой фразе непонятно?
> несовместимых реализаций Все операции, которые я упоминал в своих постах, работают для всех предикатов.
Подытожим: ты не понял ни одного предложения из тех, что были тут написаны, но срешь в тред своими идиотскими портянками. Нахуя? Либо иди читай книжки, либо попытайся подумать головой и понять, о чем идет речь, задавая вопросы, если тебе непонятно. Спорить о чем-то, в чем ты не шаришь даже на базовом уровне - это выставлять себя обезьяной.
Вот видите? Я не тролль, отвечаю конструктивно даже последним дебилам, трачу время на тыкскызыть просвещение подрастающей молодежи.
>Код с буленами обосрал выше по треду Обосрал тем, что обидно назвал его "каноничным примером мизюза буленов"? Не засчитано.
>Физбаз написал Ты сделал детсадовскую ошибку забыв про случай (x % 15) = 0 Когда тебя в это ткнули ты спохватился и написал (div-by-3? fn/and div-by-5?). Решение получилось так себе, так как функции div-by-3? и div-by-5? вызываются по два раза вместо одного. Поста с полной версией кода от начала до конца мы от тебя так и не дождались.
>Какие выгоды ...? >подумай сам Я уже подумал, и даже расписал свои рассуждения.
>зачем вообще люди придумывают имена У булеана уже было имя, аналогия не работает.
>Если понадобится ... - соснешь. Переход от "badclass" к "class == Class.BAD" осуществляется легко. Значит если есть возможность не соснуть имея "class == Class.BAD", то и с "badclass" сосать не обязательно.
>Непроверяемо Да, непроверяемо, ровно как и твой вариант. Я уже писал об этом.
>если ты чего-то не понимаешь, то проблема обычно в тебе >Дальше ты вообще хуйню какую-то пишешь. >а сишный булеан ты, вообще говоря, можешь запихнуть любое вынутое из залупы число
>Я не ебу, откуда ты это высрал. google://Church Booleans
>это комбинатор, дебил А выглядит как функция высшего порядка.
>ПРЕДИКАТЫ ВОЗВРАЩАЮТ СВОЙ АРГУМЕНТ Ты вкладываешь в это слово смысл, ясный только тебе. Для нормальных людей >Предикат в программировании — выражение, использующее одну или более величину с результатом булева типа.
>>1085827 >Не засчитано. Ну так ты прочитай пост целиком, а не только первое предложение.
>div-by-3? и div-by-5? вызываются по два раза вместо одного Мы вам перезвоним. Нет, ты серьезно не понимаешь, что когда ты пойдешь на интервью, от тебя все будут ждать именно этого - очевидного и простого - решения? Как бы суть физбаза именно в этом. Но это так, на будущее тебе.
> это комбинатор, дебил > А выглядит как функция высшего порядка. Лол. Погугли, что такое комбинатор. Ох, лол. Хоть в рамочку и на стенку вешай.
> Ты вкладываешь в это слово смысл, ясный только тебе Перечитай тред с самого начала, я несколько раз объяснил, какой смысл я в это слово вкладываю.
А лучше - съеби с треда. Не перечитывай, не надо оно тебе.
Признаю свою ошибку; ты - тупое, необучаемое говно, неспособное не только написать что-то полезное по теме треда, но и даже просто понять, о чем тут идет речь. Бесполезный, безмозглый нытик. Съеби.
>>1085846 >прочитай пост целиком, а не только первое предложение. Прочитал. Обсирания нет и в принципе быть не может, ведь ты сам признал что код не читал.
>будут ждать именно этого - очевидного и простого - решения Больше поинтов даёт вариант с булеанами + пояснение что самодокументируемый код это хорошо.
Заметил также, что определил ты "div-by? x n", а используешь div-by-3? и div-by-5? Похоже ты просто не способен написать физзбаз.
>какой смысл я в это слово вкладываю Вместо того чтобы назначать слову новый смысл возьми другое слово, шизик.
>>1086650 Мне пока не с кем тут вести дискуссию. Никто не смог написать ничего по делу, никто не вкатился со своим языком. Вот и ты - обиженный школьник, чье мнение очень важно для нас. Съеби.
>>1088083 Максим, твои поделки обречены на провал. Ты никого не уважаешь, позволяешь себе оскорблять других, истеришь как девченка. Логично, что после всего этого, тебя никто за полноценного не принимает.
>>1084622 Вот писал бы сразу такие простыни или давал бы ссылку на текст, где аналогичное написано, цены бы не было твоим вбросам. Специально ждёшь, пока анон угадает, какой правильный вопрос тебе задать? Сигму через Пи закодировал уже?
>>1088151 Нахуй пошел, девственник говноебанный. На самом деле меня максимка никогда не посылал, так что я не умею под него мимикрировать.
>>1088229 Ну я вообще-то рассчитывал зафлеймстартить обсуждение, а не личный бложек тут устраивать.
> Сигму через Пи закодировал уже? А надо? Ну, то есть мы наш палочный оператор выбора можем сделать асинхронным, хуе-мое, чики-брики, там что-то нормальное получится, но я не пробовал. А объекты тут вообще нахуя? Ты же про сигму от луки? Короче, разверни мысль.
Блядь, какой же я охуенный, вот если так посмотреть. Единственный недостаток - пишу на английском как нигер из мексики с пятью классами баптисткой школы и шизофренией.
>>1088417 Перед тем, как заходить в этот тред, надо включать мозг. Те, кто этого не делают, будут посланы нахуй быстрее, чем они успеют сказать "не понял".
>>1088435 Да при чем тут не зашел, ноль информации в твоих каментах. Такое ощущение что ты перед кем-то выйобуешься. Передо мной не нужно, для меня ты никто.
>>1088437 Инфы в том, что те кого не интересует мнение других, просто проходят мимо. Кто не ищет славы, тот не пишет в интернете громкие посты, матеря кого-то, и оправдывая себя. Не носит длинные волосы с козлиной бородой. Не одевается в разноцветную одежду, специально. Не применяет различные жаргонизмы. Ну и т.д. и т.п.
Все это ради того чтобы заметили, чтобы стать популярным, крутым в глазах общества, громко заявить о себе.
>выйобуешься Даже мат правильно написать не смог. Выёбываешься надо писать.
>>1088444 >Тебе никто ничего не собирается доказывать Ой, как же я теперь жить то буду.
>>1088444 >научись думать своей головой Высказал исключительно собственное мнение, не основанное на мнениях других. Никогда ничего не делал/не думал, из-за того что все так делают/думают.
>>1088444 >не строй обиженку Так не я же обвиняю всех вокруг. Обиженка винит всех вокруг в своих неудачах.
>>1088306 >Но ведь в этом выражении eq? : x->x->x? Это ты типо приебался, что оно должно называться make-eq, или что? Ну, по идее да, это генератор предикатов получается. Но нахуй об этом думать - к тому же, как я выше написал, лучше получится, если функции будут работать с таплами.
>Запятая - это что-то типа bind (мы же в монадке Maybe)? Хм, ну не совсем. (Иногда запятая - это просто запятая, лол.) Сам бинд зашит в семантике языка. returning x - это Just-кейс бинда. В принципе можно переписать это с континуэйшеном k, тогда будет k x, а само выражение с предикатом задает сам дататайп, который мы биндим к k, как-то так.
Но опять же, это все хуйня. Если у нас функции работают с таплами и есть линейные типы, то мы можем просто всегда передавать в предикаты read-only ссылки. Тогда предикатам вообще не нужно принимать и возвращать обратно свой аргумент, они просто могут либо фейлиться, либо нет, то есть чистый контрол флоу, абстракция буленов с бранчами.
>>1088529 >Это ты типо приебался, что оно должно называться make-eq, или что? Это я пытаюсь понять что ты понаписал. Т.е. тип x? всё-таки синоним (x->x) и итоговый тип предиката (x->x->x) ?
>к тому же, как я выше написал, лучше получится, если функции будут работать с таплами. Ну ок, каррирование послали в жопу. Но не получится ли так, что в процессе вычислений таплы будут упакованы в таплы, которые упакованы в таплы итд?
>Сам бинд зашит в семантике языка >returning x - это Just-кейс бинда Это-то как раз понятно. Непонятна была запятая.
>чистый контрол флоу Изобретён data-driven programming ?
>>1088580 >тип x? всё-таки синоним (x->x) Шта? Нет. x? - это, грубо говоря, Maybe x. Только мейби неявно и наружу в типы не торчит.
>eq? : x->x? Заметил сейчас в твоем предыдущем посте - я вот этого нигде не писал же. (eq? x:X) : X -> X?. Предикат всегда возвращает x?, поэтому если доебываться, то eq? - не предикат (ибо никогда не фейлит), а (eq? 1) - уже предикат. Но опять же, все это нахуй, если мы с таплами работаем.
> каррирование послали в жопу. Не, просто нескучный синтаксис для него придумали.
> таплы будут упакованы в таплы Я еще в прошлом посте об этом хотел написать :3 Да, нам нужны нескучные таплы: <x> . <y> => <x y>, x => <x>. В частности, map : ([x] (x -> y) -> [y]) на самом деле принимает [<x1..xn>] хуевину, все данные гоняются запакованными в структ. Но это оптимизировать обратно нетрудно. Тут есть, разумеется, подводные камни, но я эту хуйню придумывал ОЧЕ давно, неделю назад вот наткнулся на старые черновики и запилил тред, чтобы по ходу дела хоть что-то вспоминать.
> data-driven programming М? Я просто имею в виду, что предикаты тогда не могут влиять на данные в программе, то есть КОНЦЕПТУАЛЬНО контрол флоу отделяется от данных (в отличие от буленов, которые это в некотором смысле коуплят).
Вообще, листаю сейчас всю эту хероту - блин, жалко, что не допилил.
Алсо, если тебе интересно, откуда у этой хуйни ноги растут (ты там выше ссылки на тексты реквестировал): в начале был форт, который пизда, конечно, и у него был функциональный братик - Joy, но он был нетипизированным, и был еще Factor, который тоже был нетипизированный, но господин Слава Пестов запилил там оче симпатичную библиотеку комбинаторов (и дохуя всего еще запилил, вообще пароход и человек), и еще был Jon Purdy (sic!), у которого был Kitten, который был типизированный, но недостаточно типизированный. А, еще XY был и дюжина вариаций на тему "а давайте вместо стека что-нибудь нескучное впихнем". Но основная проблема в том, что все оно было row polymorphic, а потому нихуя не типизировалось, плюс всякие интересные комбинаторы зачастую вообще whole-stack operations используют, что пизда. А без нескучных комбинаторов получается point-free haskell, то есть УГ. Но не конкатенативщиной же одной, есть еще APL (J, K...), которые тоже tacit. Короче, в итоге вырисовывалось что-то среднее, где по-прежнему конкатенация = композиция, но без злоебучего стека. И тайп инференс только локальный, но это даже хорошо. Можно делать cleave\spread\bi, можно делать вилки с хуками, можно грабить корованы. Дальше, еще был Icon c его goal-directed execution - отсюда тема про предикаты, которая отлично ложится на конкатенативщину (ну потому что обычный x -> Bool предикат съедал бы аргумент, так что его бы пришлось либо клонировать, либо использовать joy-style ифы с лямбдами, но там вылазит row polymorphism, хуй пизда). А еще вместо х-ля с манатками был Clean c uniqueness types - олдфаги не помнят, ньюфаги не знают. И опять это все идеально ложится на конкатенативщину: мы же в любой функции либо явно возвращаем аргумент, либо явно же его дропаем. Ну, можем еще явно его дублировать. То есть без всяких костылей, очевиднейший тип для print : (World Str -> World). А тут еще такая хуйня с этими линейными типами: мы же можем обновлять внешне иммутабельные структуры in-place! Блядь, да мы же можем даже гц выкинуть (спойлер: ага, щас)! Тут меня, короче, понесло, и я захотел высокоуровневый конкурентный конкатенативный функциональный низкоуровневый язык для байтоебства без рантайма с intersection\union\row types, эффектами, predicate dispatch, occurence typing, compile-time gc, завтипами, пиздой твоей мамаши, макросами (разумеется) и главное - БЕЗ ЕБАНЫХ МАНАТОК, АХАХАХАХА! Ну, надо ли уточнять, что закончилось все это весьма предсказуемо, особенно учитывая мое образование в виде девяти классов церковно-приходской школы. Как-то так.
Да, так что каким бы психопатичным мудаком максимка не был, как человек своего дела он охуенный и я ему завидую. Лангуаж рисерч - это оче круто и вообще наркотик, а если это еще и твой основной оккупейшен - то ты воще малаца, батя точно одобряет. Да и в целом русское ФП-комьюнити, несмотря на всю его ебанутость, вызывает у меня - стороннего, в общем-то, наблюдателя - исключительно теплые чувства: ностальгию и светлую грусть.
А, ну и еще там рекурсия реализуется через комбинаторы (джой, фактор), так что можно вообще запретить явную рекурсию и попробовать получить - опять же, очень натурально и интуитивно - интересный саб-тьюринг лангаж.
>>1088603 >но он был нетипизированным, Вообще то типизирован, но динамическая типизация, да. Joy - охуенный язык для преподавания PLT, в особенности для объяснения денотационной семантики.
--------------------------------------------------------------------------------------------------------------------------
положняк такой
- boolean - говно уровня goto
- весь код должен исполняться в maybe-монаде
- ЗА ИСКЛЮЧЕНИЕМ явно указанных мест
ну то есть не мейби надо указывать, а его отсутствие, нутыпонел
- эксепшены только в виде паники
- паттерн матчинг - говно и опционален
- если тебе нужно передавать информацию об ошибке caller'у, значит это не ошибка
поясняй