Size: a a a

2021 February 19

p

polunin.ai in rust_offtopic
Zaner
ну самое время начинать её писать
пусть разрабы пишут лол
источник

p

polunin.ai in rust_offtopic
это их работа
источник

ID

Iv@n Dereviankin in rust_offtopic
Zaner
GAT'ы ведь скоро, кто-нибудь видел крейты с реализацией новой std? а то ничего кроме generic_std не нашел
Кто такие гаты?
источник

EG

Emmanuel Goldstein in rust_offtopic
Кроме того, у Go есть compatibility promise, который мешает им переписать хотя бы std, чтобы она перестала бросаться пустыми интерфейсами во все стороны
источник

А⚙

Антон ⚙️ in rust_offtopic
Ilya Lakhin
И зачем это вообще надо? Как эти телодвижения улучшают корректность программы с точки зрения системы типов?

Вот например(это псевдокод) у меня есть такая программа:


var foo = {a: 100, b: 200.0}; // я хочу чтобы он мне вывел тут что foo типы {a: int, b: float}

function bar(param: {a: int}) {
}

// я хочу, чтобы тут он понял, что я передаю объект, соответствующий запрошенному интерфейсу.
bar(foo)


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

Z

Zaner in rust_offtopic
Iv@n Dereviankin
Кто такие гаты?
источник

Z

Zaner in rust_offtopic
polunin.ai
это их работа
её скорее всего до 2.0 менять не будут
источник

А⚙

Антон ⚙️ in rust_offtopic
Ilya Lakhin
И зачем это вообще надо? Как эти телодвижения улучшают корректность программы с точки зрения системы типов?

Вот например(это псевдокод) у меня есть такая программа:


var foo = {a: 100, b: 200.0}; // я хочу чтобы он мне вывел тут что foo типы {a: int, b: float}

function bar(param: {a: int}) {
}

// я хочу, чтобы тут он понял, что я передаю объект, соответствующий запрошенному интерфейсу.
bar(foo)


Вот эти все "я хочу" вполне выводятся в компил-тайме без взяких именованных интерфейсов, тайпклассов и прочего обслуживания компилятора.
Ну и тайпклассы шире интерфейсов. Как ты предлагаешь компилятору выводить, скажем, FromStr? Или Send?
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Ilya Lakhin
И зачем это вообще надо? Как эти телодвижения улучшают корректность программы с точки зрения системы типов?

Вот например(это псевдокод) у меня есть такая программа:


var foo = {a: 100, b: 200.0}; // я хочу чтобы он мне вывел тут что foo типы {a: int, b: float}

function bar(param: {a: int}) {
}

// я хочу, чтобы тут он понял, что я передаю объект, соответствующий запрошенному интерфейсу.
bar(foo)


Вот эти все "я хочу" вполне выводятся в компил-тайме без взяких именованных интерфейсов, тайпклассов и прочего обслуживания компилятора.
bar : HasA param => param -> ()

record Foo = Foo { a : Int, b: Int} deriving HasA

let foo = Foo 100 200
in bar foo

ну и?
источник

EG

Emmanuel Goldstein in rust_offtopic
Ну то есть гошные дженерики как-то решает ту проблему, что го вообще никак невозможно пользоваться, но они всё ещё говно
источник

IL

Ilya Lakhin in rust_offtopic
Антон ⚙️
Это совершенно не предотвращает ситуаций, когда ты передал в функцию не то, а код компилируется, потому что значение удовлетворило интерфейс случайно
Если значение удовлитворило запрошенный интерфейс, значит значение может быть обработано данной функцией, либо функция плохо сделана, расширяй её интерфейс.
источник

EG

Emmanuel Goldstein in rust_offtopic
Ilya Lakhin
Если значение удовлитворило запрошенный интерфейс, значит значение может быть обработано данной функцией, либо функция плохо сделана, расширяй её интерфейс.
Семантика
источник

EG

Emmanuel Goldstein in rust_offtopic
Представим себе, что функция принимает интерфейс send: async fn()
И мы случайно передали в функцию не штуковину, которая присылает клиенту отчёт, а штуковину, которая посылает клиента нахуй
источник

IL

Ilya Lakhin in rust_offtopic
Антон ⚙️
Ну и тайпклассы шире интерфейсов. Как ты предлагаешь компилятору выводить, скажем, FromStr? Или Send?
function foo(something_to_sting: {to_string: (x) -> String})


условно говоря так.
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Ilya Lakhin
И зачем это вообще надо? Как эти телодвижения улучшают корректность программы с точки зрения системы типов?

Вот например(это псевдокод) у меня есть такая программа:


var foo = {a: 100, b: 200.0}; // я хочу чтобы он мне вывел тут что foo типы {a: int, b: float}

function bar(param: {a: int}) {
}

// я хочу, чтобы тут он понял, что я передаю объект, соответствующий запрошенному интерфейсу.
bar(foo)


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

ΑZ

Αλεχ Zhukovsky in rust_offtopic
а не чтобы она падала "ой мне передали говно"
источник

EG

Emmanuel Goldstein in rust_offtopic
С номинативными интерфейсами у тебя нет риска пересечения названий функций у разных вещей
источник

ID

Iv@n Dereviankin in rust_offtopic
Zaner
её скорее всего до 2.0 менять не будут
Когда раст 2.0 выйдет == когда рак на горе свиснет
источник

EG

Emmanuel Goldstein in rust_offtopic
С структурными интерфейсами, тебе всегда нужно думать «а точно ли эта функция делает ровно то, что мне нужно»
источник

А⚙

Антон ⚙️ in rust_offtopic
Ilya Lakhin
Если значение удовлитворило запрошенный интерфейс, значит значение может быть обработано данной функцией, либо функция плохо сделана, расширяй её интерфейс.
Даже если значение из одной либы, а функция — из другой?
источник