Pull to refresh
-2
2

Специалист по теории типов USB-кабелей

Send message

Чем плохо?

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

Асинхронность — это просто один из эффектов. Эффекты полезно видеть в типах. Особенно в большой кодовой базе.

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

А плюсы этого больше не дают, всё. Без оптимизаций у вас std::move может быть отдельной функцией (а может и не быть), но без оптимизаций на плюсах на практике никто не пишет (кроме совсем настоящих программистов, пишущих такой код, что глупый оптимизатор его ломает), а с оптимизациями — там такая же магия, как в каком-нибудь JIT-языке.

уметь писать собственные аллокаторы, контейнеры и т.д.

Контейнеры-то легко, и это можно делать на любом языке, а аллокаторы в плюсах — не стоит вскрывать эту тему. Про это на конференциях доклады делают, причём не об алгоритмике и машинных особенностях, а об особенностях языка (типа, как пропагейтить аллокатор std::vector'а в std::string'и, которые там лежат).

И, кстати, почему настоящий программист должен машинные инструкции и аллокаторы? Почему не категориальную семантику его программы и монадические регионы?

Что значит «новый тип»? Какие типы были, и какой тип — новый?

Когда я открываю реальный промышленный код на хаскеле, то там нормально всё с newtype.

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

Это, конечно, отсылка к личному опыту и вообще немного выпендрёж, но по-другому отвечать на тезисы «в реальном продакшен-коде не используются несовместимые алиасы типов / тесты / системы контроля версий» тяжеловато.

Другое дело, что он не ко всем проектам подходит (я вот, например, сегодня добавил поддержку нового обрабатываемого типа данных в выполняющуюся программу прямо на ходу, не останавливая её)

Мне как-то (не) везёт писать такой код, где между мной и продом либо несколько слоёв стейджинга, либо это вообще библиотеки и вещи уровня «тайпчекер и интерпретатор для языка смарт-контрактов», где «менять программу при выполнении» не имеет особого прикладного смысла.

Поэтому, короче, я не могу эффективно спорить на этой территории за отсутствием наработанных паттернов. Какой тип добавили? Зачем? В чём конкретно это добавление выражается? Где бы вы упёрлись в выразительном статически типизированном языке? ХЗ.

Если выкинуть из вашей фразы слово «паскалевской», то не соглашусь: приблизит.

В какой версии буста там STRONG_TYPEDEF появилось? Судя по копирайту в хедере (2002-й год) — рано появилось, может, даже раньше boost.lambda и всего такого. Надо, наверное, зачем-то людям разделять типы, чтобы неявных преобразований и ошибочных присваиваний не было.

А что с ней?

sort : Ord a ⇒ [a] → [a]

Я могу скомпилировать модуль, определяющий эту функцию, без знания конкретного типа.

Я могу скомпилировать другой модуль, скажем,

slowPartialMax : Ord a ⇒ [a] → a
slowPartialMax = head . reverse . sort

тоже без каких-либо конкретных типов.

Я вроде не смешивал.

Ну отлично. Тогда ML-стайл вывод типов вам норм?

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

О, здесь мы согласны. Но из этого есть простой вывод: не надо рассматривать паскаль (а не «не надо рассматривать статическую типизацию»).

До JS и CPython.

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

Другое дело, что в части проектов на TS половина типов — any, но это, гм, другое дело.

Ну так это ключевой момент.

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

Для генерика тип параметра должен быть указан в момент его компиляции. Это не всегда возможно.

Не понял. Можно пример?

Религиозной традицией я назвал декларации типов переменных.

А почему вы смешиваете отсутствие типизации (нет, я никогда не буду в серьёзных разговорах использовать оксюморон «динамическая типизация») и неявную типизацию?

Более того, статическая типизация – это шаг к нестрогой типизации, то есть к неявным преобразованиям типов. Даже в Паскале

Паскаль у нас теперь образец языка с сильной и выразительной системой типов?

Реальная востребованность их, как видим, невелика.

Ну куда уж TS и mypy до Lisp и Scheme, понятное дело.

Языки Lisp и Scheme (и Лого) динамически типизированные, но там нельзя прибавить единицу к почтовому адресу.

Когда именно я узна́ю, что я где-то случайно попытался прибавить единицу к почтовому адресу?

Однако в качестве примеров почему-то приводите задачи ввода-вывода, где статическая типизация не имеет существенного значения. Вы же не предлагаете на самом деле раскидывать нюансы работы с внешним миром по всей программе, вместо того чтобы обучать отрабатывать сериализацию/десериализацию данных на границах слоев?

Статическая типизация как раз помогает доказать убедиться, что на границах слоя сериализация/десериализация была выполнена, и что все части слоя согласны с тем, что именно должно было быть (де)сериализовано.

иметь не одно значение — значит

…быть функцией не A → B, а A → 𝒫B.

Вы не подумайте, я не против статической типизации, а очень даже за. Кстати, скажите, если у переменной xs тип Vect n Int (n — число), а ys : Vect m Int, то какой тип у конкатенации xs и ysVect (n + m) Int или Vect (m + n) Int? В ряде теорий это два разных типа.

Это перевод "Оптического журнала", ведущего журнала в этой области.

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

Впрочем, найти какие-то наукометрические показатели у исходной русскоязычной версии исключительно тяжело. Какие-то цифры есть только здесь: https://geomag.izmiran.ru/files/jrating-IF2.pdf , и там у русскоязычной версии IF — почти те же 0.62. Журнал в надёжной компании таких именитых и серьёзных изданий, как «Вестник СГУГиТ (Сибирского государственного университета геосистем и технологий)» и «Анналы аритмологии».

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

"Компьютерная оптика" (в ней у меня 2 статьи) имеет Q1

Как вы квартили русскоязычных журналов находите? Поделитесь, пожалуйста, мне для личного интереса.

Впрочем, в списке выше IF, конечно, тоже получше, целых 0.695.

и не имеет переводной версии. Другие статьи - Q2, К1

Но ссылок на них нет, читателю предлагается найти их самостоятельно поиском по этой теме.

Вы в библиографии ссылки тоже так делаете — «[7] найдите поиском по этой теме»? Если не секрет, какой bibtex-ключ соответствует этому виду ссылок?

уже всё, что можно было сделать, сделано.

Этим конкретным математиком или в математике вообще? Если первое, то почему?

Journal of Optical Technology

Переводной, IF 0.6, в математике — Q4 (если верить этому). То есть, мусорный журнал.

Я на четвёртом-пятом курсах опубликовал несколько статей в Q3/Q4-журналах, но это не делает меня математиком, или эффективным, или ещё кем-то там.

И в этом рассмотрении декатровы тройки равны.

Только их не существует (особенно если рассматривать «просто множества»).

По крайней мере, не существует в ZF. В ZF нет ни пар, ни троек, ни других n-туплов как примитивов, там есть только множества. Пары там определяются как, упрощая, синтаксический шорткат: например, можно определить (a, b) ≜ \{ a, \{ a, b \} \}(и дальше в ZF можно доказать, что это определение ведёт себя как ожидается, вроде (a, b) = (a', b') \implies a = a'\land b = b'), или как \{ \{ a \}, \{ a, b \} \}(это эквивалентное определение, но ему ЕМНИП не нужна аксиома регулярности из ZF).

Соответственно, пара (a, (b, c)) и пара ((a, b), c) — это сильно разные множества. И A × (B × C) вместе с (A × B) × C — это тоже сильно разные множества (которые в ZF строятся такими-то костылями, и данные вами в прошлом комментарии логические формулы не имеют прямого отношения к определению этих множеств, хотя их и можно получить после упрощения, но β-эквивалентность — это не синтаксическое равенство). Но, конечно, в школьной (и прикладной вузовской) математике никто не вспоминает про ZF или другие основания математики, поэтому там это всё неважно, и можно интуитивно считать эти множества одинаковыми.

В теоркате, кстати, декартовых произведений может быть (бесконечно) много (например, в Set A×B — это и множество пар\{ (a, b) \} вместе с двумя очевидными проекциями, и множество \{ (b, a) \} с теми же проекциями, но наоборот, и множество \{ (\{ 0, a \}, \{ 1, b \}) \}с чуть менее очевидными проекциями), поэтому их там тоже обычно рассматривают с точностью до изоморфизма.

Но, разумеется, можно создать более сложную структуру - допустим какое-то "множество с типами" и с ним уже делать различия. Вот интересно как вы это формально определите. В принципе, я уверен, это должно быть уже сделанно в каком-нибудь раннем источнике.

Теория типов, собсна, уже тоже придумана. Что-нибудь в духе Мартина-Лёфа будет выглядеть примерно как:

  • Постулируем существование конструктора типов ×: A : Type, B : Type ⊢ A × B : Type

  • Постулируем конструктор термов ⟨⟩: a : A, b : B ⊢ ⟨a, b⟩ : A × B

  • Постулируем элиминатор. Если не вскрывать тему с зависимыми типами и зависимыми элиминаторами, то проще всего через проекции:
    A × B : Type ⊢ π₁ : A × B → A
    A × B : Type ⊢ π₂ : A × B → B

  • Постулируем операционную семантику:
    π₁ (⟨ a, b ⟩) ⇝ a
    π₂ (⟨ a, b ⟩) ⇝ b

  • В зависимости от конкретной теории типов (экстенсиональная/интенсиональная, есть ли UIP, всякое такое вот) может быть полезно постулировать η-равенство: ∀ p : A × B. ⟨ π₁ p, π₂ p ⟩ ≡ p.
    Кстати, даже тут уже, если присмотреться, видны намёки на некоторые проблемы с единственностью, пусть и слегка другого рода.

Дальше ещё изоморфизм ∀ X. (X → A × B) ≅ (X → A) × (X → B), который по факту выражает привычное универсальное свойство произведений.

О, Clawfinger… Верните мне мой 2007-й.

У них там ещё есть пара забавных песен (nigger и the faggot in you), названия которых в давних нулевых цензурились на торрент-трекерах, и в именах файлов, и в тегах.

У моих любимейших Structures есть альбом «Divided By», на котором заключительный трек называется «/», который у меня на ФС называется почему-то 10 - ,.flac. Пожалуй, стоит переименовать в ⁄ по совету комментатора рядом.

Information

Rating
1,374-th
Registered
Activity