Size: a a a

Rust — русскоговорящее сообществo

2020 August 20

V

Vladimir in Rust — русскоговорящее сообществo
Alex Zhukovsky
если ты сделаешь очень большой КОНСТАНТНЫЙ список тогда мб и да
Ещё можно боксом, и тоже рекурсии не будет, но не в компайлайме работать будет
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
это не хлист потому что он не позволяет хранить элементы разного типа и не требует матчинга через трейты
А, действительно.

Но я к тому, что тут в типе размер хранится и динамически с такой структурой особо не поработаешь
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
А, действительно.

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

OA

Oleg Andreev in Rust — русскоговорящее сообществo
Вафель
А, действительно.

Но я к тому, что тут в типе размер хранится и динамически с такой структурой особо не поработаешь
Зато ты получил очередную порцию фП/МЛ поучений совершенно бесплатно
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
да не, можно работать, но определенные сложности офк возникнуть могут
А как ты с ним полностью динамически будешь работать, если у тебя добавление элемента тип изменяет?
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
А как ты с ним полностью динамически будешь работать, если у тебя добавление элемента тип изменяет?
dyn Node :)
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
dyn Node :)
Если ты сможешь сделать функцию Box<dyn Node<T>> -> T -> Box<dyn Node<T>> то снимаю шляпу
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Ну в идрисе мог, в расте не уверен) Но может как-нибудь попробую
источник

V

Vladimir in Rust — русскоговорящее сообществo
@Psilon а почему у трейта Node тайппараметр а не ассоциативный тип
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
@Psilon а почему у трейта Node тайппараметр а не ассоциативный тип
Потому что

impl<T> Node<T> for Nil {}
источник

V

Vladimir in Rust — русскоговорящее сообществo
Я бы больше спросил, зачем там вообще трейт
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Потому что

impl<T> Node<T> for Nil {}
Ну никто не мешает сделать Nil<T> я скорее логику написания спрашиваю
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Vladimir
@Psilon а почему у трейта Node тайппараметр а не ассоциативный тип
потому что может быть Node<i32> и Node<i64>
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
Я бы больше спросил, зачем там вообще трейт
Чтобы это был не HList X)
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
потому что может быть Node<i32> и Node<i64>
Так это будут Cons<i32, _> и Cons<i64, _>
источник

V

Vladimir in Rust — русскоговорящее сообществo
Alex Zhukovsky
потому что может быть Node<i32> и Node<i64>
Это не объясняет ничего, с ассоциативным типом, тоже могут быть разные ассоциативные типы в разных реализациях
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вафель
Так это будут Cons<i32, _> и Cons<i64, _>
достаточно уметь в базовую логику. Генерики это \forall, а тайппараметр это \exists.

Очевидно что корректнее говорить \forall T. Node<T>, а не \exists T. Node<T>
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Vladimir
Это не объясняет ничего, с ассоциативным типом, тоже могут быть разные ассоциативные типы в разных реализациях
так реализация одна LinkedList должна работать с произвольным типом Т, а не с каким-то одним
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Вопрос точно про Node а не Cons?
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
достаточно уметь в базовую логику. Генерики это \forall, а тайппараметр это \exists.

Очевидно что корректнее говорить \forall T. Node<T>, а не \exists T. Node<T>
Для меня не очевидно(

Я бы так сделал:

trait Node {
   type Item;
}

struct Nil<T>(PhantomData<T>);

impl<T> Node for Nil<T> {
   type Item = T;
}

struct Cons<N: Node> {
   head: N::Item,
   tail: N,
}

impl<N: Node> Node for Cons<N> {
   type Item = N::Item;
}

(playground)
источник