Size: a a a

F# Flood: Fine art of primal management

2021 April 22

AH

Ayrat Hudaygulov in F# Flood: Fine art of primal management
Прагматичность разная бывает. В 99% тебе поибать на боксинг - гц вытащит, а тебе валуе надо приносить
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Потому что его ты не сделаешь так, чтобы он нормально соптимизировался.
источник

AH

Ayrat Hudaygulov in F# Flood: Fine art of primal management
1% случаев - ок, оптимизируем
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Тут скорее речь про то, что раст нет смысла брать, если тебе оптимизировать нужно только в 1% случаев
источник

VK

Vladislav Khapin in F# Flood: Fine art of primal management
там нет инвариантных/ко дженериков что ль или ещё чего
источник

SB

S B in F# Flood: Fine art of primal management
нет, ну может быть какие-нибудь пятиэтажные макросы и смогли бы. я не знаю, но пользоваться этакой кракозяблей было бы ужасно.
источник

AH

Ayrat Hudaygulov in F# Flood: Fine art of primal management
а преждевременные оптимизации все же зло. Это не оправдание говнокода, это именно про преждевременные оптимизации
источник

AH

Ayrat Hudaygulov in F# Flood: Fine art of primal management
Согласный
источник

VK

Vladislav Khapin in F# Flood: Fine art of primal management
я про итераторы
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Нет, тут две проблемы:
1. Все замыкания, генераторы и футуры из асинков имеют принципиально неназываемые в стабильном расте типы, поэтому если ты хочешь вернуть из метода трейта без боксинга футуру асинковую или замыкание - то тебе придется ощутимо извращаться. В ночном расте получше, но всё равно с приключениями.
2. Отсюда идёт вторая проблема, чтобы вернуть без боксинга подобный тип из трейта, ты в трейте создаешь ассоциированный тип вроде:
trait HasIterator {
  type MyIterator: Iterator<Item = i32>;
  fn create_iterator(&self) -> Self::MyIterator;
}


И вопрос, а как выразить то, что у твоего типа &'a self и его итератора будет одинаковое время жизни? Т.е. что итератор зависит от времени жизни текущей ссылки на твой тип?

А никак
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Потому что ты в стабильном расте не можешь написать такую штуку:
```
trait HasIterator {
  type MyIterator<'a>: Iterator<Item = i32> + 'a;
  fn create_iterator(&'a self) -> Self::MyIterator<'a>;
}
```
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Потому что ассоцированных типов, зависящих от других типов пока не завезли (это как раз некое подмножество HKT)
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
А прикол в том, что чтобы в расте вернуть из трейта итератор не сделав бокс - тебе нужны:
1. Ассоциированные типы (это аналог type families из хаскеля в неком смысле)
2. Экзистенциальные типы (чтобы назвать неназываемый тип генератора, замыкания или асинка)
3. HKT или Rank2 трейты (если костылём пользоваться)

Офигеть как прагматично
источник

VK

Vladislav Khapin in F# Flood: Fine art of primal management
Чёт они перемудрили но я понял проблему, странно что итераторы и прочее не являются типами стдлибы или ещё как
источник

SB

S B in F# Flood: Fine art of primal management
звучит так, что чтобы в Расте вернуть итератор из трейта, нужна степень в компютер саенс
источник

VK

Vladislav Khapin in F# Flood: Fine art of primal management
типо даже в плюсах не так хуево, учитывая их тоже перемудреное апи
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Да, на что я и ругаюсь
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
Ну тут проблема в том, что для каждого замыкания, асинка или генератора генерируется свой тип, который назвать просто так ты принципиально не можешь.

Тип есть, компилятор его знает, он им пользвуется, но дать название ты, человек, ему не можешь. И следовательно нормально сослаться на него ты тоже не можешь.
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
(В стабильном расте, в ночном можно как раз экзистенциалы подцепить)
источник

DS

Doge Shibu in F# Flood: Fine art of primal management
А тип генерируется, чтобы не боксить замыкания, генераторы и т.п. и чтобы можно было их сделать зирокост на статическом диспатче
источник