Size: a a a

2021 February 01

A

Agrailag in rust_offtopic
Αλεχ Zhukovsky
Пока что фантики это битки))
Почти любой фиат фантик, только чеканные монеты тру
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Вспомни страницу заказа делающий 300 запросов
источник

EG

Emmanuel Goldstein in rust_offtopic
Я продолжаю размышлять над своей идеей про систему типов, которая на самом деле просто пачка const fn
Кажется, это позволяет реализовывать достаточно сложные фичи почти бесплатно
Она не даёт бесплатно зависимые типы и линейные/афинные/релевантные типы, но HKT, GAT, специализация идут бесплатно
Трейт — это просто функция
my_trait :: (Type, ...) -> Maybe (Type, ...)

(где (Type, ...) это «tuple из некоего количества элементов типа Type»)
Если трейт возвращает Just ..., то он реализован и внутренности Just — ассоциированные типы
Если Nothing, то трейт не реализован
При компиляции вместо сложной магии настоящих тайпчекеров, мы просто вызываем функцию и смотрим, что она вернёт
Специализация — это просто if внутри функции
Дженерик-типы — это функция, которая принимает тип и возвращает тип
HKT — это просто частично применённый дженерик-тип (и мы даже можем делать разные лейауты для разных аргументов дженерика, простым ифом)

У меня, правда, ощущение, что вывод типов это ломает напрочь, кроме самых тривиальных случаев. Фиг бы с тем, что тут очевидно получается Тьюринг-полный тайпчекинг, но для рабочего вывода типов тут потребуется реверсивно исполнять Тьюринг-полную программу что эээ немного невозможно. Вывод возвращаемого типа функции будет работать нормально, но вывод типов аргументов будет сломан на уровне «проще вообще его не делать». Возможно, конечно, эту боль можно как-то уменьшить с помощью простого синтаксиса для type ascription, но всё равно неприятно.
источник

EG

Emmanuel Goldstein in rust_offtopic
Если совсем больно, можно пробовать это облегчить перегрузкой во варианте «работает первый вариант, у которого сошлись типы»
Тогда объявление нескольких перегрузок с частыми вариантами типов аргументов перед основной перегрузкой с дженерик-типами поможет инференсу. Но тогда возникают новые проблемы с тем, что если подходят несколько перегрузок, то вывод типов может выбрать не ту.
источник

EG

Emmanuel Goldstein in rust_offtopic
Возможно, вместо перегрузок можно сделать «инференс-хинты» с правилом «если подошёл ровно один инференс-хинт, то берём типы из него»
Но это несколько ломает смысл дженериков — придётся писать кучу сигнатур для каждой дженерик-функции. С другой стороны, это, возможно, лучше, чем совсем сломанный вывод типов.
источник

s

suhr in rust_offtopic
Emmanuel Goldstein
Я продолжаю размышлять над своей идеей про систему типов, которая на самом деле просто пачка const fn
Кажется, это позволяет реализовывать достаточно сложные фичи почти бесплатно
Она не даёт бесплатно зависимые типы и линейные/афинные/релевантные типы, но HKT, GAT, специализация идут бесплатно
Трейт — это просто функция
my_trait :: (Type, ...) -> Maybe (Type, ...)

(где (Type, ...) это «tuple из некоего количества элементов типа Type»)
Если трейт возвращает Just ..., то он реализован и внутренности Just — ассоциированные типы
Если Nothing, то трейт не реализован
При компиляции вместо сложной магии настоящих тайпчекеров, мы просто вызываем функцию и смотрим, что она вернёт
Специализация — это просто if внутри функции
Дженерик-типы — это функция, которая принимает тип и возвращает тип
HKT — это просто частично применённый дженерик-тип (и мы даже можем делать разные лейауты для разных аргументов дженерика, простым ифом)

У меня, правда, ощущение, что вывод типов это ломает напрочь, кроме самых тривиальных случаев. Фиг бы с тем, что тут очевидно получается Тьюринг-полный тайпчекинг, но для рабочего вывода типов тут потребуется реверсивно исполнять Тьюринг-полную программу что эээ немного невозможно. Вывод возвращаемого типа функции будет работать нормально, но вывод типов аргументов будет сломан на уровне «проще вообще его не делать». Возможно, конечно, эту боль можно как-то уменьшить с помощью простого синтаксиса для type ascription, но всё равно неприятно.
Ты изобрёл Zig
источник

EG

Emmanuel Goldstein in rust_offtopic
suhr
Ты изобрёл Zig
Zig недокрутили идею
источник

s

suhr in rust_offtopic
Да, и есть ещё одна небольшая проблема: как проверить дженерик, если он не используется?
источник

OA

Oleg Andreev in rust_offtopic
Agrailag
Почти любой фиат фантик, только чеканные монеты тру
перевези-ка чемодан монет через границу
источник

OA

Oleg Andreev in rust_offtopic
или пошли полмонетки в аргентину
источник

DS

Doge Shibu in rust_offtopic
Emmanuel Goldstein
Я продолжаю размышлять над своей идеей про систему типов, которая на самом деле просто пачка const fn
Кажется, это позволяет реализовывать достаточно сложные фичи почти бесплатно
Она не даёт бесплатно зависимые типы и линейные/афинные/релевантные типы, но HKT, GAT, специализация идут бесплатно
Трейт — это просто функция
my_trait :: (Type, ...) -> Maybe (Type, ...)

(где (Type, ...) это «tuple из некоего количества элементов типа Type»)
Если трейт возвращает Just ..., то он реализован и внутренности Just — ассоциированные типы
Если Nothing, то трейт не реализован
При компиляции вместо сложной магии настоящих тайпчекеров, мы просто вызываем функцию и смотрим, что она вернёт
Специализация — это просто if внутри функции
Дженерик-типы — это функция, которая принимает тип и возвращает тип
HKT — это просто частично применённый дженерик-тип (и мы даже можем делать разные лейауты для разных аргументов дженерика, простым ифом)

У меня, правда, ощущение, что вывод типов это ломает напрочь, кроме самых тривиальных случаев. Фиг бы с тем, что тут очевидно получается Тьюринг-полный тайпчекинг, но для рабочего вывода типов тут потребуется реверсивно исполнять Тьюринг-полную программу что эээ немного невозможно. Вывод возвращаемого типа функции будет работать нормально, но вывод типов аргументов будет сломан на уровне «проще вообще его не делать». Возможно, конечно, эту боль можно как-то уменьшить с помощью простого синтаксиса для type ascription, но всё равно неприятно.
Так проще тогда сразу делать язык с зав типами и всё
источник

EG

Emmanuel Goldstein in rust_offtopic
suhr
Да, и есть ещё одна небольшая проблема: как проверить дженерик, если он не используется?
?
У нас есть некие констрейнты, которым должен соответствовать дженерик — например, my_trait(T).is_some(). Мы их запускаем и проверяем.
источник

DS

Doge Shibu in rust_offtopic
Там функции Type -> Type - это в норме вещей
источник

s

suhr in rust_offtopic
Emmanuel Goldstein
?
У нас есть некие констрейнты, которым должен соответствовать дженерик — например, my_trait(T).is_some(). Мы их запускаем и проверяем.
Чтобы запустить, нужно передать конкретный тип.
источник

EG

Emmanuel Goldstein in rust_offtopic
Doge Shibu
Там функции Type -> Type - это в норме вещей
Угу, только завтипы — это много головоломной теории, и потом часы обсуждений в чатиках «как доказать поворот матрицы». Я тупой. Я не хочу ничего доказывать.
источник

DS

Doge Shibu in rust_offtopic
Emmanuel Goldstein
Угу, только завтипы — это много головоломной теории, и потом часы обсуждений в чатиках «как доказать поворот матрицы». Я тупой. Я не хочу ничего доказывать.
Это зависит от того, как их использовать
источник

A

Agrailag in rust_offtopic
Oleg Andreev
перевези-ка чемодан монет через границу
Для этого придумали долговые расписки
источник

DS

Doge Shibu in rust_offtopic
Просто не надо придумывать очередной непроверенный адхок костыль
источник

EG

Emmanuel Goldstein in rust_offtopic
suhr
Чтобы запустить, нужно передать конкретный тип.
А, об этом я тоже думал
Для проверки функции мы можем породить фейковый «тип», для которого заданные функции возвращают заданные значения.
источник

DS

Doge Shibu in rust_offtopic
Если есть уже готовая и изученная теория
источник