Здравствуйте, D. Mon, Вы писали:
DM>>>Еще раз: что именно у тебя здесь означает Т+1?
V>>Тоже, что у тебя — сумма типов, т.е. алгебраик {A t:T | B}, где A и B произвольные идентификаторы, например Just и Nothing.
DM>Ок. Тогда утверждение о том, что любой ссылочный тип таков, я считаю ошибочным.
Ты не можешь считать чьи-то утверждения ошибочными или нет, пока не обоснуешь.
"Пролетарское чутьё" не считается.
V>>Это твои слова?
V>>Например, в Расте Box<T> и Option<Box<T>> представлены в памяти одинаково
V>>Ты в них уверен?
DM>Вот из доки слова:
DM>This usage of Option to create safe nullable pointers is so common that Rust does special optimizations to make the representation of Option<Box<T>> a single pointer. Optional pointers in Rust are stored as efficiently as any other pointer type.
DM>https://doc.rust-lang.org/1.10.0/std/option/index.html
V>>Точно ли Rust умеет оптимизировать такие сценарии до описанного?
DM>А ты точно читал доку?
Именно что читал определения Optional и Box. А ты читал?
В общем, если Rust умеет оптимизировать конкретную связку только этих 2-х типов — то это неинтересно. Это лишь некрасивый костыль.
Вот если бы он из исходных определений Optional и Box получил то же самое, причем, воспроизводимое на любых других пользовательских Optional_2 и Box_3, то это был бы респект.
DM>>>Во-вторых, ссылочный тип не обязательно содержит null, я ж об этом говорю. См. тот же Котлин или Раст.
V>>Ссылочный тип обязательно содержит.
DM>Нет, это твои иллюзии.
Опять пролетарское чутьё подсказывает? ))
Разве тебя не впечатлило, что я еще в глаза не видя этого Rust сразу сказал, где у тебя ошибка?
Если язык Rust контролирует значение этого индекса через систему типов, то поздравляю — это зачатки зависимых типов в языке.
А если нет, то это не ссылочный тип.
Речь шла о твоём Box<T>.
Процитированное ты не переплюнешь вааще никак, бо только языки с поддержкой зависимых типов умеют контролировать строгость указателя на уровне типов. А все остальные языки порождают аналогичные гарантии сугубо на прикладном уровне.
Поэтому, ты и сам должен был бы препроверить, без моей помощи, что там в Rust происходит (зависимые типы в языке или Box<> не является ссылочным типом) — ведь это ты взялся приводить примеры из этого языка, верно? Я ж за тебя столько работы сделал, получается. ))
DM>Есть немало языков, где это не так.
Ну, с языком Rust уже разобрались — мимо.
Котлин не смотрел, а что там? Зависимые типы? Или строки имеют семантику value-type? ))
Ну вот читаю вводную статью по Котлин:
Нулевые указатели — одна из наиболее недопонятых концепций в языках программирования. Нет ничего плохого в том, что некоторое значение может быть установлено, а может отсутствовать. Такая концепция есть во многих языках программирования. В Хаскеле она называется Maybe, в F# это option, в T-SQL это null.
Блин, прямо с языка снимают — я именно это и говорил в предыдущих постах. ))
Почитал далее — всё ясно. Они разнесли nullable и non-nullable ссылочные типы по ТИПАМ, а не по значениям одного и того же типа.
ЧТД. Нубы. Ниасилили ЗТ. ))
Этот трюк полностью аналогичен Box<T> из Rust или любому показанному мною StrongRef<T>, скажем, в С++ или в другом, сколь-угодно "опасном" языке.
Подтерждается это так же тем, что отсутствует возможность сравнивать сами ссылки.
И переменные иммутабельны. (я правильно понял?)
Итого — ссылочного типа в языке нет.
V>>Обрати внимание на struct Box и struct Strong.
V>>Оба типа хранят внутри себя ссылочный тип, но сами НЕ являются ссылочным типом.
DM>Почему именно не являются?
Потому что RTFM.
Типы Box и Optional определены средствами языка.
Первый — это struct Box, второй — enum Optional.
Ни один из них не является ссылочным типом в системе типов Rust.
А как конкретная комбинация типов представлена в памяти — да какая разница? Пусть даже займут ячеек размером с указатель, но в системе типов они никогда не станут эквивалентны указателю T*.
Абсолютно точно так же, если в С++ обернуть структурой указатель:
template<typename T>
struct Box { T * ptr_; };
То представление в памяти этой структуры и указателя будет идентичным. А вот в системе типов — дудки.
DM>>>Теперь напиши Option<string> по твоей задумке, да так, чтобы получилось T + 1, а не T.
V>>String в дотнете и джаве — он уже является Option изкаробки, как любой настоящий ссылочный тип.
DM>Нет. Еще раз напомню про T+1, T+1+1 и т.д.
Лучше было бы помедитировать, прежде чем опять неткать и опять мимо.
Потому что T+1 != T+1+1
Дальше озвучивать или уже догадался?
DM>Попробуй сформулировать точно определение ссылочного типа и определение Option<T>.
Я уже дал тебе определения
тут:
http://www.rsdn.org/forum/philosophy/6705938.1
и тут:
http://www.rsdn.org/forum/philosophy/6706396.1
Ты пока не смог аргументировать ни за, ни против.
Я могу и подождать.