Re[10]: Опциональные типы
От: vdimas Россия  
Дата: 23.02.17 04:54
Оценка: :)
Здравствуйте, 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

Ты пока не смог аргументировать ни за, ни против.
Я могу и подождать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.