Комментарии 105
Скажем, я хочу написать функцию remove, которая удаляет определенный элемент из списка. Должна ли она обойти весь список и удалить все совпадения с образцом или же остановится на первом сопоставлении? Тогда чем она отличается от filter? Что если я хочу, чтобы сопоставление с образцом было более умудрённым? Удалить первые 4 элемента, соответствующих определенному условию. Или чтобы я за условиями обращался куда-нибудь во внешний мир. Как только таких простых функций недостаточно, приходится писать новые.
а то что "удаляет определенный элемент" это значит удаляет именно определенный, то есть точно идентифицированный в списке элемент по индексу например, а filter это функция которая возвращает список этих ID (индексов например) разве не будет проще??? Просто не путать назначения функций и/или смысл слов, разве не проще???
Еще раз убеждаюсь что ФП это
Ещё со времен моего знакомства с программированием, больше всего меня волновала именно сложность, присущая любой предметной области и способы борьбы с оной.
способ борьбы со сложностью методом увеличения сложности. Наверно потому что если сложность не привнести то вроде как и бороться не с чем.
Избегать слов любой ценой
Тут есть проблемки.
Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.
Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)
Незнакомый с нотацией человек мало того что неспособен прочесть написанное, он даже не может нормально задать вопрос "что делает Х", потому что непонятно как назвать Х.
Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.
Поэтому всё что я пытаюсь сделать в Я - это отодвинуть компромисс между простотой использования и обобщенностью концепций ещё дальше
В смысле, ещё сложнее использовать чем Haskell?
P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.
P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.
Разумеется, туториалы - это следующий шаг после знакомства с самим языком. Вроде никто обычно не жалуется, что не может понять код на языке, которого он не знает. Это нормально. У вас просто не получится с наскока со всем разобраться, минуя фундамент.
В этой статье уже было указано, что я использую лигатуры, а не юникод - поэтому для ввода символа используются буквы. В разделе с операторами объясняется, как их вводить - за каждой буквой закреплён свой токен.
Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у
<*>
нет своего названия, но ничего - люди как-то пользуются.Нотация там несложная, нужно просто прочитать страничку с операторами и всё станет на свои места. Но как я уже и говорил ранее, это нормально, что человек, не знающий языка не может его прочитать. Если под читаемостью подразумевается именно С-подобный синтаксис - тогда я могу понять.
Можно либо выделить уже отрендереный символ и вставить его в поисковой ввод, либо просто нажать Backspace и глянуть из каких символов он состоит.
В смысле, ещё сложнее использовать чем Haskell?
Я не могу сказать, что использовать Haskell сложно. Для меня это один из самых лёгких языков программирования с ясной семантикой и предсказуемым поведением. Под "отодвиганием компромиса" имеется ввиду обобщение базовых конструкций в стандартном Haskell.
Если вы знакомы с функцией zoom
из библиотеки lens
- то в Я
это контравариантный функтор из категории атрибутов (аналог линз) в категорию стрелок (функций) по первому параметру в State
. И вместо функции zoom
(которое является словом и имеет свои ассоциации), я могу использовать оператор ha
(Hom-функтор, contrAvariant). Если этот абзац показался вам сложным, то мне правда нечего вам предложить и этот язык не для вас. Но если вас вдруг заинтересовало, то я могу помочь разобрать и другие аспекты этого языка.
Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у <$> нет своего названия, но ничего - люди как-то пользуются.
Инфиксный map/fmap. А >>= это bind. Вопрос даже не в словах, а можно ли это хуглить.
У меня не получается объяснить, что операторы в Я не надо гуглить - их надо читать. Они состоят из логографических токенов и объясняют, что они делают. Нет нужды к каждому инфиксному оператору добавлять синоним (bind, traverse), только для того, чтобы его запоминать. Вот тут всё объясняется, как это работает: https://muratkasimov.art/Ya/Operators
Вы можете упрямиться и продолжать настаивать на том, что все вокруг неправильно делают, а надо делать так как вы предложили. Или можете попытаться понять почему другие люди пишут, что у них полная фрустрация от происходящего. Я подписываюсь под каждым пунктом в первом комментарии этого треда. Могу добавить, что мне пришлось лезть в интернет за тем, чтобы найти значение слова "логографический" при том, что я знаю разницу между графемами, морфемами и сенонами. За себя скажу, что если Вы пойдёте по первому пути, то я буду считать, что вы просто сделали язык под себя, и перестану им интересоваться совсем.
P. S. Почему бы Вам не попробовать это дело в азиатской среде продвинуть?
Не вижу где автор говорит такие вещи как "все вокруг неправильно делают, а надо делать так как он предложил". Придумал что-то своё, показал другим, в чём проблема? Я не раз видел как на HN или Reddit люди постили гораздо более странные и нишевые вещи, часто бесполезные, порой даже дикие, и другие люди, часто с большой репутацией, уважительно разбирались, интересовались ходом мысли автора, находили даже чем восхититься, давали дельные советы, желали успехов. Ваша личная претензия к автору, похоже в том, что он не принёс ничего полезного лично вам, вот действительно, о чём с такими разговаривать! Ещё же имеют наглость что-то публиковать! Вот так надо каждого экспериментатора затравить, а потом удивляться что на хабр пишут только всякую чушь про котиков и основы питона. Что вы сделали для того чтобы следующий экспериментатор захотел с вами поделиться на хабре своим безумным проектом? Закидали камнями всех предыдущих? Велком некст ван. Да, на сто хобби проектов хорошо если один в итоге станет чем-то полезным, но если остальные 99 не велкомить, то этого одного и не будет никогда! Надо людей мотивировать, помогать им, и другие видя что со скромными проектами людей нормально встречают будут больше стараться. Что блять за комунити такое где все всё знают про все языки и паттерны, а элементарных вещей по комунити билдинг не понимают.
Не вижу где автор говорит такие вещи как "все вокруг неправильно делают, а надо делать так как он предложил"
В сообщении, на которое я отвечал, буквально написано
У меня не получается объяснить, что операторы в Я не надо гуглить - их надо читать
Я признаю, что мог неаккуратно подобрать, но хоть убейте я не понимаю где Вы в моём сообщении нашли шапкозакидательство с моей стороны. Могу отдельно обратить внимание на то, что вот это
P. S. Почему бы Вам не попробовать это дело в азиатской среде продвинуть?
Не подъеб и не предложение свалить в туман. Это интуитивное предположение, что азиатам, привыкшем к логографическому письму и которым в частности не привыкать делать клавиатуры с иероглифами "Я" может подойти гороздо лучше, чем в рускоязычном или англоязычном сегменте.
Что вы сделали для того чтобы следующий экспериментатор захотел с вами поделиться на хабре своим безумным проектом? Закидали камнями всех предыдущих?
Пишу технические статьи осознавая, что я пишу их не для себя или своих коллег, продираюсь через адские проблемы c версткой формул с хабровским wysiwyg, получается не всегда.
Что блять за комунити такое где все всё знают про все языки и паттерны, а элементарных вещей по комунити билдинг не понимают.
Вы говорите о том, что плохо закидывать камнями авторов, а через пару предложений закидываете камнями комментатора.
Разумеется, туториалы - это следующий шаг после знакомства с самим языком.
Нет, не разумеется. Изучать что-то можно как от общего к частному, так и от частного к общему. От туториалов обычно ожидается второе. Но с вашими туториалами это не работает.
Если вы знакомы с функцией zoom из библиотеки lens - то в Я это контравариантный функтор из категории атрибутов (аналог линз) в категорию стрелок (функций) по первому параметру в State. И вместо функции zoom (которое является словом и имеет свои ассоциации), я могу использовать оператор ha (Hom-функтор, contrAvariant). Если этот абзац показался вам сложным, то мне правда нечего вам предложить и этот язык не для вас.
Возможно вы правы и я глуповат. А возможно вы слишком сложно объясняете простые вещи. Такое часто за хаскеллистами замечают. Как уже ставшее классикой "монада - это просто моноид в категории эндофункторов, чего тут непонятного". Или как Кнут, который для объяснения алгоритмов выдумывает вымышленный компьютер с вымышленным ассемблером. Я верю что можно было обойтись без этого, возможно даже получив большую лёгкость усвоения.
У вас есть This/That, которые вы определяете как left/right. А чем собсна сами по себе слова left/right не подошли?
Или Optional/Maybe/Halts. Есть хоть какая-то причина использовать три термина для одного и того же кроме повышения порога входа? Многие знают что такое Optional или Maybe. Уверен, гораздо меньше кто догадается что такое Halts, не прочитав его определение.
Что такое Forth? Не нашёл его описание нигде.
Почему вы называете типы, которые можно собрать из других типов, примитивами?
Кстати, в описании hv опечатка, должно быть [V]oid
, а не [V]nit
.
В общем возможно вы построили хорошую и прекрасную концепцию. Но очень старательно спрятали её за столькими порогами входа, через которые надо продраться, что кажется по дороге потеряли свою идею об уменьшении сложности.
Нет, не разумеется. Изучать что-то можно как от общего к частному, так и от частного к общему. От туториалов обычно ожидается второе. Но с вашими туториалами это не работает.
Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.
Возможно вы правы и я глуповат. А возможно вы слишком сложно объясняете простые вещи.
Дело не в глупости, а в знакомстве с определенными концепциями. Если вам это не интересно - это ваше дело, не понимаю, зачем вы мне ставите в упрёк то, чего вы не знаете и не собираетесь узнавать. Я использую для объяснений те концепции, который используется в самом языке, минуя промежуточные абстракции (которые всё равно потом отбросятся, когда вы попробуете понять фундамент).
монада - это просто моноид в категории эндофункторов, чего тут непонятного
Да, это известная шутка. Но я честно говоря не вижу ничего смешного в том, чтобы повторять то, чего ты не понимаешь и демонстративно отказываясь от этих знаний. Как если бы я одел очки и кривлялся в них перед теми, кто их носит.
Я не использую понятие монад в Я, вместо них используются естественные преобразования, из которых может получится монада - но это не обязательно.
Многие знают что такое Optional или Maybe. Уверен, гораздо меньше кто догадается что такое Halts, не прочитав его определение.
Ну наверное надо прочитать определение. Документация не полная, я не всё описал. Если чего-то нет в документации, можно заглянуть в код - это вполне нормальный процесс в программировании.
Кстати, в описании hv опечатка, должно быть
[V]oid
, а не[V]nit
.
Спасибо, сейчас исправлю.
Но очень старательно спрятали её за столькими порогами входа, через которые надо продраться, что кажется по дороге потеряли свою идею об уменьшении сложности.
Вы сами устанавливаете себе порог. Вы прямо сейчас тратите своё драгоценное время на написание комментариев о том, что вы отказываетесь понимать фундамент, на котором строятся основы языка. Они на самом деле простые, но на них придётся потратить время, как и на изучение всего того, что вам до этого было не известно.
Ну наверное надо прочитать определение.
Или надо удалить Halts
, потому что оно ничего в язык не привносит, а только увеличивает когнитивную нагрузку и время изучения. Но я понял, уменьшение порога входа не входит в ваши цели.
Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.
Я думал вы запостили эту статью чтобы получить фидбек. Видимо нет. Ну как хотите. Хорошего вечера.
Что такое монада?
https://wiki.haskell.org/index.php?title=Monad_tutorials_timeline
Любая ссылка подойдёт
Не, так не интересно. Гуглить то я и сам умею, ну и в фп тоже. Хотел от автора объяснение услышать
to talk about what lies beyond the obscure term monad by starting with functors.
то есть монада это - the obscure term, если любая подойдет.
Конечно, вы что SICP не читали?
даже если не читал - прочитать не проблема. На что вы советуете обратить внимание?
На предисловие - про духов в машине и нас, пишущих заклинания. Мне по серьёзке трудно воспринимать вопрос про монады в комментариях под постом, который не все хаскеллисты понимают. То ли ирония, то ли человек дверью ошибся.
Если правда хотите понять о чём речь - советую начать с Milewski, Category Theory for Programmers. А про SICP шутка была, это что-то вроде библии функциональщиков - просветляет, вставляет, но немного про другое.
«Монада» — это просто такой интерфейс, удовлетворяющий определённым законам, как «ассоциативный контейнер» или «итератор». Зачем человека сразу теоркатом грузить?
"Монада" - это сущность, принципиально непостижимая человеком, который не привык программировать на функциональных языках программирования.
Да нет же, любой кто хоть раз видел promise-ы (также известные как future), асинхронные функции или flatMap
может понять что такое монада
— Весь этот разговор довольно примитивен. Мы ведь начали с того, кто я по своей природе. Если угодно, я полагаю себя… Ну скажем, монадой. В терминах Лейбница.
— А кто тогда тот, кто полагает себя этой мандой?
— Монада и полагает, — ответил я, твердо решив держать себя в руках.
— Хорошо, — сказал Чапаев, хитро прищуриваясь, — насчет «кто» мы потом поговорим. А сейчас, друг милый, давай с «где» разберемся. Скажи-ка мне, где эта манда живет?
— В моем сознании.
— А сознание твое где?
— Вот здесь, — сказал я, постучав себя по голове.
;)
А ассоциативный контейнер — это сущность, принципиально непостижимая кем?
Ассоциативный контейнер - это понятно. Но я не смог валидировать ваше утверждение, что монада является таковым. Где об этом можно прочитать?
Монаду можно определить так же (в смысле, плюс-минус тем же языком и на том же уровне абстракций), что и ассоциативные контейнеры. Процитирую себя из другого комментария:
Ассоциативный контейнер — это любая штука, в которую можно вставлять, искать и удалять, и для которой операции удовлетворяют ряду законов, вроде lookup key (insert key value container) = Just value
или insert key v2 (insert key v1 container) = insert key v2 container
(тут есть тонкости с требованием дополнительных операций на типеkey
, но не будем вскрывать эту тему). Мапа — ассоциативный контейнер. Хэшмапа — тоже. Список пар — тоже. LRU-кэш — не ассоциативный контейнер, и вот почему: [...].
Функтор — любая штука, у которой есть метод map
с такой-то сигнатурой и удовлетворяющий законам map id = id
, map g . map f = map (g . f)
. Список — функтор. Maybe
— функтор. Мапа с зафиксированным типом ключа — функтор. Скучный тип data Unit a = Unit
— функтор (тоже скучный).
Монада I — любой функтор, у которого есть ещё две операции, pure
и join,
с такими-то законами.
Монада II — любой функтор, у которого есть ещё две операции, pure
и >>=
, с такими-то законами.
Монада I эквивалентна монаде II: join
и >>=
взаимно выражаются, поэтому можно просто рассматривать понятие монады, пользуясь тем базисом, что удобнее в данный момент, но при этом достаточно определить pure
и либо join
, либо >>=
. Список — монада. Maybe
— монада. ZipList
— не монада, и вот почему: [...].
Самое лучше пояснение за монады, что я видел:
https://youtu.be/IkXg_mjNgG4?si=rFEzTHzc_J-dyRtq
Я использую для объяснений те концепции, который используется в самом языке, минуя промежуточные абстракции
А это не то же самое, что рассказывать об английском на английском ацтеку?
Избегать слов любой ценой
APL тоже пошел в сторону краткости синтаксиса и где он теперь? Там сам чёрт ногу сломит в этих значках. Зачем впадать в крайности, не понимаю.
Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.
Agda это успешно решает вводом закорючек через аккорды. Например, ≡ — это \==, а ≗ — \circeq.
Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)
В агде это тоже решается: люди вполне успешно описывают эти значочки терминами из предметной области, например.
Незнакомый с нотацией человек мало того что неспособен прочесть написанное, он даже не может нормально задать вопрос "что делает Х", потому что непонятно как назвать Х.
И это.
Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.
Да норм:

Agda это успешно решает вводом закорючек через аккорды.
У вас очень много опечаток в фразе "Agda это решает через костыли".
Если бы на клавиатурах реально был символ ≗ (и у него было человеческое название), я был бы только за использовать его в программировании. Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.
У вас очень много опечаток в фразе "Agda это решает через костыли".
Не нашёл ни одной, потому что написано то, что я и так хотел сказать.
Код пишется один раз, а читается много раз. Куда удобнее читать код, в котором не используются (визуальные) многозначковые комбинации или, чего хуже, слова, для тех вещей, для которых в предметной области есть устоявшаяся нотация.
У вас есть код
T-Abs : Γ ⊢[ θ ] τ₁ ⇒ τ₂
→ Γ , τ₁ ⊢[ θ ] ε ⦂ τ₂
→ Γ ⊢[ θ ] ƛ τ₁ ε ⦂ τ₁ ⇒ τ₂
где используются кастомные операторы и функции-закорючки, в порядке их появления — трёхместный _⊢[_]_
(_
обозначает, куда идёт аргумент) и бинарный _⇒_
на первой строке; четырёхместный _⊢[_]_⦂_
и бинарный _,_
во второй строке, и бинарный ƛ
в третьей. Как бы вы написали это обычными словами, чтобы это можно было прочитать?
Если бы на клавиатурах реально был символ ≗
Одна из причин мне использовать эргодокс со слоями. Греческие буквы и наиболее частые символы я повесил на отдельные слои.
и у него было человеческое название
Поточечное пропозициональное равенство двух функций.
Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.
Ох уж этот реальный мир и отсылки к нему, когда по реальным миром каждый понимает что-то своё.
в риальном мире так та и матиматика ненужна, и вуз, и дажи старшые классы школы. чаивые калькулятар пащитает, а граматнаст тоже ненужна ведь вы этоттекст тоже можите прачитать и панять што яимел ввиду
У вас есть код
Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности. И автору в статье тоже приходится вставлять код скриншотами.
ведь вы этоттекст тоже можите прачитать и панять што яимел ввиду
Ох уж этот максимализм... А у вас нет каких-то промежуточных вариантов между греческим и падонкафским?
Одна из причин мне использовать эргодокс со слоями.
Вы можете хоть при помощи вибратора с рулём код писать. Но никакой бизнес на это завязываться не будет.
Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности.
А вы с телефона пишете код или проводите ревью?
Заодно там ширину строк под телефон (учитывая засилье вертикальных видео — в вертикальной ориентации) адаптировать не нужно?
Ох уж этот максимализм...
Не максимализм, а демонстрация, что слова про реальный мир — это не аргумент, потому что им мы приходим к очевидно бредовым выводам.
Вы можете хоть при помощи вибратора с рулём код писать. Но никакой бизнес на это завязываться не будет.
Пойду расскажу об этом бизнесам, которые за агду платили.
А вы с телефона пишете код или проводите ревью?
Ревью делаю, а что?
Ширину строк в кодстайле/линтере сделали такой, чтобы side-by-side-дифф влезал на экран? Или, может, удобство работы с мобильника не является ключевым фактором для кодингового окружения?
У меня были работы, где весь кодинг шёл через RDP на серверах где-то там, для доступа к чему надо было приложить палец к yubikey, вставленному в usb-порт. Код (и ревью, и прочее) у меня с мобилы не открывался вообще никак, ни квадратиками, ни вопросиками. Я правильно понимаю, что RDP — непригодная технология, и никакой бизнес на неё завязываться не будет?
Но это риторические вопросы. Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?
Да чо вы за мобильник зацепились. Открыл на линукс-десктопе, тоже квадратики.
Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?
Не знаю. Об этом надо много думать, я не позиционирую себя как дизайнер языков программирования. Но не надо быть поваром чтобы понять что борщ недосолен.
Открыл на линукс-десктопе, тоже квадратики.
ХЗ, у меня с fira code всё работает.
А вот код на go, например, у меня тоже не заведётся за отсутствием компилятора go.
Не знаю. Об этом надо много думать, я не позиционирую себя как дизайнер языков программирования.
Ну вот оказывается, что во всех языках, которые претендуют на хотя бы возможность формализации таких вещей и которые при этом успешны на этом поприще, есть возможность (и культура) работы с закорючками, кастомные миксфиксные операторы (вот эти все трёх-четырёх-пятиместные штуки с подчёркиваниями), и так далее. Много разных людей думало и не придумало ничего лучше.
Но не надо быть поваром чтобы понять что борщ недосолен.
У всех аналогий есть границы применимости, и у этой тоже.
у меня с fira code всё работает
Да, я понял, вы как и автор статьи безусловно всегда на 100% правы. А если у кого-то ваш подход вызывает трудности, то проблема всегда на их стороне, а вы д'Артаньян.
Нет, конечно. Просто альтернативы ещё хуже.
А говорить, что (разовая, имеющая константную сложность) подготовка окружения к работе с каким-то инструментом — это недостаток инструмента, очень странно. Тогда все инструменты отстой и не готовы для бизнеса, потому что для всех инструментов нужно готовиться. Даже для программирования в машинных кодах надо хекс-редактор поставить.
Ну либо остаться на машинах, где весь интерфейс сводился к тумблерам на передней панели — там ничего ставить и готовиться не надо, идеальные машины, только бизнес тупой и слез с них почему-то.
Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить. Если бы был нормальный способ писать текст в трёх-пяти измерениях, может ваши закорючки выглядели бы отсталым средневековьем на фоне того что можно творить. Но когда начинается ha'yo'he - это костыли и кривая попытка игнорировать ограничения реального мира.
Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить.
Ненормальный способ их вводить — это, условно, тыкать по экранной клавиатуре. Я не вижу существенных проблем с упомянутым выше способом, когда равенство из трёх горизонтальных палочек — это просто два знака равно подряд.
Слои на эргодоксе — ещё удобнее. Для определённой задачи определённые инструменты повышают удобство ⇒ я покупаю этот инструмент и овладеваю им. А с вашей точки зрения ни один бизнес никогда бы не завязался на аппсторы и производство приложений для них, потому что там нужно купить макбук (сильно дороже эргодокса) и получить полный вендорлок на конкретную экосистемы.
А способов ввода текстов в пяти измерениях нет вообще, никаких.
Агда очень костыльная в этом плане. Во-первых набор символов сильно ограничен по сравнению с техом, во-вторых нужно искать шрифты поддерживающие закорючки. У Isabelle/HOL, насколько я знаю, в тексте обычные символы, а в редакторе они отображаются как закорючки. Такой подход, кмк, сильно лучше агдовского
Ну хз. Шрифты с закорючками всё равно нужны (а то как их редактор рисует-то?), аккорды вводить всё равно нужно (просто они не автозаменяются на уникодные символы), но при этом вне редактора (на гитхабе, например) приходётся читать неформатированный латех. По-моему, это строго нелучше и по некоторым аспектам хуже.
Во-первых набор символов сильно ограничен по сравнению с техом
Можно добавлять нужные, но отсутствующие в ваш редактор! Агде ж всё равно, она любой уникод жрёт.
Шрифты с закорючками всё равно нужны (а то как их редактор рисует-то?)
У меня была проблема не столько с самими закорючками, сколько с их размещением. У юникода множество сабскриптов очень ограниченно. Например в агде уже не написать, потому что в юникоде нет символа
.
Можно добавлять нужные, но отсутствующие в ваш редактор! Агде ж всё равно, она любой уникод жрёт.
Можешь привести какой-то пример? Я, кажется, не совсем понимаю что имеется ввиду
Например
в агде уже не написать, потому что в юникоде нет символа
.
Это на самом деле тоже раздражает, но между кастомным рендерером в редакторе (что заодно привязывает меня к редактору — вряд ли nvim так же умеет) и ограничением в индексах я скорее выберу второе.
Можешь привести какой-то пример? Я, кажется, не совсем понимаю что имеется ввиду
Можно сюда добавлять всякое по желанию.
Ну или у меня самописный плагин для nvim'а — там тоже просто в файл добавляешь новые сочетания, и всё.
эти операторы забирают на себя одну из самых сложных аспектов в программировании - порядок вычислений
В большинстве языков программирования вычисления выполняются в том порядке, в котором они записаны в коде, и вообще никакой сложности в этом нет.
Я и не подозревал, что всё на самом деле так просто! Ни ветвлений, ни условий, ни прыжков в другие участки кода. Просто инструкции, одна за другой...
Читаем сверху вниз, как дошли до jmp - прыгаем в соответствующее место, продолжаем читать сверху-вниз. Да с этим даже дети справляются (см какой-нибудь Scratch).
Вот читать мейкфайл например куда сложнее, потому что надо пройти по зависимостям, собрать весь граф, а потом развернуть его задом наперёд.
Да с этим даже дети справляются
Вопрос не в том, кто с этим справляется, а в том, что control flow может быть достаточно сложен и один из лучших способов сделать его легче - это декларативность. А вот запускать интерпретатор в своей голове, пытаясь разобраться что происходит с такими jmp
- может и оперативной памяти не хватить.
Я не совсем понимаю, к чему эти конкретные примеры - как это вообще к это теме этой статьи относится?
Даже взрослые еле справляются со сложными control flow. Я лишь предлагаю свой подход к решению этой проблемы. Он может вам не нравится, но это ваше дело и вы можете критиковать его, просто хотелось бы больше конструктивности.
В большинстве языков программирования вычисления выполняются в том порядке, в котором они записаны в коде, и вообще никакой сложности в этом нет.
Как в C отличается порядок выполнения str && str[0] == 'a'
против str & str[0] == 'a'
?
Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам. И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать &
я не знаю).
Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам.
Подобный костыльный short-circuiting есть во всех¹ императивных языках, и подобная разница есть везде¹, где есть заодно и битовые операторы. Плюс, он действительно костыльный: например, в плюсах &&
коротит только для встроенных типов, и свои short-circuiting-операторы вы определять не можете нигде¹.
¹ из тех языков, про которые я хоть что-то достаточно знаю, конечно
И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать
&
я не знаю).
Я мог бы написать (bool)str
, суть это меняет не сильно.
Но вообще затем, зачем над указателями вообще делать битовую арифметику: чтобы в младших (или старших) битиках там что-нибудь хранить. Во всяких локфри бывает полезно, да и вообще память экономит, так как указатели выровнены, и эти битики пропадают (а старшие на x86_64 не используются).
чтобы в младших (или старших) битиках там что-нибудь хранить
Чот мне кажется это UB.
Когда настоящего сишника это останавливало?
Но вообще записать что-то в младший битик указателя, а потом вернуть всё обратно перед использованием — вроде как не UB. С pointer provenance ерунда будет, вероятно, но у меня есть чувство, что pointer provenance не понимает даже Комитет.
Это серая зона. Формально UB до C++23, но по весьма забавной причине: из-за сборщика мусора. На который никто обычно никак не рассчитывает при написании C++ кода, но возможность наличия которого учтена в стандарте. Источник: https://pvs-studio.ru/ru/blog/posts/cpp/1178/
А причём тут С++23, речь идёт про C, а не C++.
Мне пишут что в C это тоже UB.
Занимательно. А для каких задач данный язык существует? Или с какими задачами он в теории лучше справляется, чем некоторые другие?
Людям с аудиальным типом восприятия очень некомфортно работать с такими значками. Конечно, жизнь заставит родиться в Китае - выучишь иероглифы, но в целом пример языка APL показывает, что это тупиковый путь. Семантика APL была востребована и нашла своё развитие в современном Фортране и Матлабе, а синтаксис нет.
Судя по вашей логике, то таким людям и читать текст некомфортно. Я пока не знаю примеров языков программирования, оторванных от текста.
Буквенный текст имеет фонетическое представление, и большинство программ вполне нормально воспринимаются внутренним слухом (кроме извращений вроде значащих отступов в питоне, которые многие проклинают в том числе и по этой причине).
Представьте, как музыкант читает ноты. Для меня, например, это похоже на программу.
Так все операторы в Я
так же можно произнести, ведь они состоят из букв латинского алфавита. Тут всё описано: https://muratkasimov.art/Ya/Operators
Автор предлагает вам учить кружочки. После этого вы сможете их читать как hi/ho/ha/he/hu. Удобно?
Интересный у вас шрифт используется, не поделитесь названием?
"Кодама". Я его так назвал, так как я не создавал этот шрифт с нуля, я взял Mononoki, изменил некоторые базовые символы и добавил автоматическую генерацию композитных лигатур. Мне это напоминило мультфильм "Принцесса Мононоке", там были такие создания, их звали Кодама и они своими телами похожи на операторы в Я. Вот тут его можно скачать.

yokl
- [Y]oneda c[O]variant [K]eisli K[L]eisli оператор
А, ну тогда все понятно, спасибо
Ой, вы прям как мой папа! Он тоже инженер-рационализатор с огромными мозгами и огромным самомнением. Разрабатывал всякие штуки и называл их сокращениями от своего имени и фамилии 😁 (но язык "Я" - это прям вершина, браво!). В советские годы они были очень востребованы, но в современном мире оказались не очень - по той же причине, которую вам во всех комментах пишут: нафига делать сложно простые вещи, если их можно сделать просто?😁
Прикол в том, что папа мой тоже ещё и лексику какую то себе выработал, примерно в вашем духе - пытаясь в простые концепции впихнуть ненужные, но очень красиво выглядящие концепции.
Была тут история значит:
Он мне, как-то давно протягивал интернет-кабель в квартиру. Естессно, как все люди такого склада, он ничего не записывает и не объясняет - ну потому что "и так же всё понятно! а если тебе непонятно - так ты просто не хочешь потратить свое бесполезное время на постижение моей мудрости☝️!". Ни схем, ни чертежей, ничего.
И вот как-то у меня поломался инет, я решил новый кабель завести и поставить роутер от другого провайдера. Для этого надо просверлить дырку в стене - а я вапще хз, где он там чего запрятал и что я могу намотать на перфоратор.
Звоню ему, говорю: "Вспоминай, чо там где тянул, хочу свой кабель вместо твоего".
А он мне в ответ:
- Зачем, дурачок? Там же оптика просветлена по трассе на медь, с коммутатора проключить надо без базы по линии сразу на частоту!
Я такой:
- Эмм...Шта??😵💫
Он с раздражением:
- Ну чо непонятного-то, простреливается же канал сразу с кросса на линию по волокну на циску - так и базу надо коммутировать сразу в медь и осветлить её на оптику!
Я опять:
- Эм..Шта шта???😵💫😵💫😵💫
Он тяжко вздыхает
- Ну... прострелить по линии...ну чо непонятно...?
Я тоже вздыхаю, чешу репу, в голове представляю всю эту картинку целиком - и тут до меня доходит:
- Ты пытаешься сказать, что надо просто роутер в щитке поставить, а в квартиру завести по старому кабелю и не сверлить дыр?
Он снисходительно кивает и бурчит что-то, означающее на его языке "Ну наконец-то ты смог прикоснуться к моей мудрости, дурачок! Пользуйся моим даром и восхищайся! А я улетаю по своим великим делам"😁
Ну, роутер в щитке - это морока с подводом электропитанием ещё большая, чем с дыркой в стене. В итоге мастер провайдера просто какими-то приборчиками прозондировал стену и за пять минут и дырку просверлил и кабель протянул. Потому что это просто, быстро и результативно.
И без загадок.
Но такое решение не назовешь "Я" и под него не сделаешь свой собственный шрифт и не будешь упрекать других в том, что оно ленятся изучить вашу великую мудрость 😁
Отлично написано. Хоть идея языка интересная и уникальная, но показательная надменность автора отбивает желание в этом разбираться, "это не я сложно сделал, это ты идиот".
Есть еще такая байка... Был такой язык Бейсик.. Да что бейсик ... писали когда-то в машинных кодах, а в итоге зачем-то С++ придумали. Не знали дураки что надо было проще... еще проще....
Ваша целевая простота в чем измеряется? То что для Вас сложно, для другого очень просто может... Или Вам просто обидно что то что автор называет простым и элементарным Вам не очень понятно?
Скрытый текст
Пока не дочитал до конца, думал, что эта статья написана гопотой, потому что никто (кроме автора этой статьи) не будет вставлять код с неочевидным синтаксисом и не объяснять хотя бы в комментариях, что каждый синтаксический элемент означает и как надо думать, чтобы самому такое написать.
Выше имеется вполне хорошая дискуссия со сравнением этого языка с Агдой. Я тоже всуну свои пять копеек.
многие люди из академии больше сфокусированы на линейных и зависимых типах - горячие темы, которые легко продать сообществу. Но на мой дилетантский взгляд, это не сделает программирование более удобным занятием (...)
Развитые системы типов нужны для того, чтобы было сложнее сделать ошибку в логике программы. К удобству программирования это имеет слабое отношение, разве что кто-то скажет «как это удобно, когда компилятор не даёт мне писать код с ошибками типизации».
Плохо, что сейчас имеется мало исследований влияния дизайна языка программирования на его эргономику. Кажется, что это ровно то, чего автору не хватает в существующих языках. Впрочем, он и на своём языке не проверяет гипотезу о том, что кому-то на этом будет писать удобнее, чем на Haskell. Хнык.
Развитые системы типов и компилятор, бьющий по голове при попытке сделать хрень, - это прекрасно. Но это легко делается без кружочков и закорючек.
Так а автор вообще не проверяет никаких гипотез по отношению к другим людям 😁
Он просто в ультимативной форме заявляет: "Вам так будет удобнее, потому что я так сказал! И потому что мне самому нравится мой язык и я даже назвал его "Я", чтобы все осознали моё величие!"😁
На самом деле, это отличный пример современного искусства, пост-модерна по всем правилам:
Это логически цельная штука с глубоко зашифрованными смыслами
Это эстетически приятно и стилистически едино
Это отрицает авторитеты и принятые устои
Но также это абсолютно бесполезно и не имеет никакого смысла, кроме того, который в него заложит сам читатель 😁
Эта статья слишком коротка. Я с первого раза ничего не понял, рассуждения показались мне слишком абстрактными. Потом я взглянул на вашу библиотеку, и понял, что мне не показалось.
newtype W_II_II_I w i ii = W_II_II_I (w ii ii i)
Я не настоящий хаскеллист, что такое функтор я понял, что такое монада - тоже понял, стрелку уже не осилил, а вот этих ваших абстракций спасибо не надо.
Что касается вашей исходной посылки про сложности предметных областей, то программирование не создано, чтобы бороться с этим.
Вам просто нужна кастомная клавиатура,и будет красиво.
Советую автору прислушиваться к критике, а не отрицать её. Ну а заявление про сложность вообще до смешного, учитывая как переусложнено всё вот это действо, прям веет элитаризмом.
Сдаётся мне, что нас обманывают и данный язык создан не для программированя, а для выхова Ктулху или ещё какой подобной сущности.
А мне понравилось. Программировать на нём я конечно не буду (с), но как минимум действительно что-то небанальное и интересно поразбираться как с головоломкой, для новых идей (у меня у самого аж целых 2 яп в разработке, и нехватка ASCII-шных символов одна из проблем).
Чтобы найти такие ответы, которыми смогут воспользоваться и другие люди, я потратил около 10 лет.
Судя по комментариям, Вы таких ответов не нашли.
— Да, — наконец сказал он изменившимся голосом.
— Конечно. Понял. ЭтоЙа
. Конечно, это жеЙа
и есть.
— Молодец, — сказал отец
— Что это такое? — спросил мальчик.
— Это отражение.
— Чего?
— Ну как же так? Ведь только что все понял, а? Давай опять логически. Спроси себя сам — если я вижу перед собой отражение и знаю, что передо мнойЙа
, что я вижу?
— Себя, наверно, — сказал мальчик.
— Вот, — сказал отец, — понял наконец.
Мальчик задумался.
;)
Избегать успеха любой ценой!
Избегать слов любой ценой!
Мы здесь...
;)
Поддержу автора, мне понравилось как надстройка над хаскелем, но еще выше уровнем.

не вижу проблем с чтением этого кода.
Обработка нажатий клавиатуры:
j - перемещение вниз
K - перемещение вниз
и т.д.
Возможно, есть шероховатости, но общая концепция понятна - отделить инструмент от бизнес-логики, что на самом деле, действительно, является проблемой разработки . Инструмент (ЯП) переплетен с предметной областью настолько, что разработчикам очень сложно выразить ясно свои намерения под тоннами абстракций, которые они пишут. Автор пытается эти абстракции как раз спрятать за спец символами, оставив чистую логику.
Не вижу проблем с изучением, как и любой язык. А абстракции на то и абстракции, чтобы один раз понять как они работают и потом не возвращаться к этому, оставив себе в качестве работы решение проблем бизнеса - конкретных задач, а не очередную борьбу выразить на очередном языке свои намерения.
С удовольствием прочитаю продолжение.
Ну вот к данному примеру у меня вопрос - почему кружочки у J не такие как у всего остальных букв. В других языках это было бы
match key {
case J: ...
case K: ...
case T: ...
case D: ...
default: return Error()
}
Т.е. все кнопки абсолютно равноправны.
Попробуйте взглянуть вот так
match key { case J:
... case K:
... case T:
... case D:
Предполагаю, что это по аналогии с хаскелем, в данном случае это "вход" в цепочку вычислений.
В хаскеле это будет что-то вроде
<$> параметр1 <*> параметр2 <*> параметр3 <*> параметр4
Когда уже есть некоторое понимание, то это кажется логичным и правильным и сами абстракции нет смысла держать в голове, остается только думать над смыслом, который хочешь выразить. Абстракции просто клей между частями головоломки
Не совсем верно выше выразился, лучше так
match key { case J: press J
case K: press K
case T: press T
case D: press D
Предположите, что есть некоторое дублирование намеренийcase J -> press J
, и поэтому эти вот case Smth
можно спрятать за некоторой абстракцией, и эти абстракции будут как некоторые контейнеры, в которые вы сложили вашу чистую логику press1...pressN
Поэтому замените типовое выражение match key { case Smth:
на какой-либо спец символ, а все следующие за ним
case Smth:
на другой
Абстракции просто клей между частями головоломки
абстракции это основа любой науки, например в геометрии безразмерная точка и параллельные прямые это абстракции. Если из науки выкинуть абстракции науки не останется. Абстракция это и есть очищенный от деталей смысл.
Очень интересно, но нибуя не понятно.
@iokasimov, хочу вас поддержать в этом. Не обращайте внимания на хейтеров. К сожалению, среди нынешних кодеров не особо много людей, стремящихся разобраться в сути вещей, которые они пытаются имплементировать в коде. Каждый день сталкиваюсь со сложной логикой в коде, которую пытаюсь рефакторить и упростить применяя подходы domain driven design и функционального программирования.
Это привело меня к Haskell. Да, для этого пришлось подтягивать недостающие знания в математике. И ваша идея мне импонирует. Есть универсальный язык, которым владеют большое количество людей разных национальностей по всему миру. Это язык математики. Он предельно точен и позволяет описывать все знакомые нам сущности реального мира. Конечно, его нужно изучать, как и любой неродной язык. И конечно, он обогащается расширениями для разных предметных областей чтобы быть более выразительным, не теряя базы: точности и однозначности.
Вы в своей работе расширяете язык математики для более удобного применения в программировании.
Помимо этого, вы прорабатываете свои навыки анализа и обобщения, логического мышления и структуризации. Я бы хотел видеть в своей команде и в отрасли вообще больше похожих на вас разработчиков.
Наверное, интересно было бы поглядеть концепцию — вместо значков фигуры и в VR 3D среде такое использовать для построения сложных конструкций.
Есть тут пара статей на тему:
https://habr.com/en/articles/138884/
https://habr.com/en/articles/139167/
Спасибо, вполне полезный материал для изучения. Вопрос по Haskell: он развивается или там застой? Давно с ним игрался, недавно снова решил поглядеть, как там дела, но что-то не увидел прогресса, как показалось.
Развивается. И библиотеки, конечно, и сам компилятор: например, относительно недавно линейные типы запилили, и планомерно-постепенно готовятся к зависимым типам (например, в ghc 9.12 запилили https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0281-visible-forall.rst ).
Как на дрожжах! ;)
Развивается и даже немного быстрее комфортного. Я на нем писал в прод с 2015-2021, очень быстро развивалась экосистема, тулинг, расширения компилятора. Небольшое комьюнити компенсируется высоким уровнем участников и вторым по скорости прототипирования языком (после Лиспа). Если бы Хаскел стоял на месте, то все промышленные тоже бы топтались, потому что постоянно подглядывают, что там нового у нас придумали.
Я: экстремально композиционный язык программирования