Re[5]: Опциональные типы
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.02.17 21:34
Оценка: :)
Здравствуйте, vdimas, Вы писали:

VD>>Ерунду полнейшую говоришь. Опшон без пооблем может быть как сылочным, так и нет.


V>Т.е. если в Nemerle опишу некий свой variant MyOptional, это будет value-тип?


Value-option не обязан быть вариантом. В немерле он сделан просто структурой.

https://github.com/rsdn/nemerle/blob/master/lib/option.n#L217

В Немерле варианты сделаны на базе классов, но это одна из возможных реализаций.

V>Я правильно понимаю, что средствами языка, т.е. через variant, его нельзя было описать как value-тип?


У языка как бы средств больше чем одно. option ни разу не обязан быть ваниантом.

V>Я-то уже 100 лет на Немерле не смотрел, но если я понимаю правильно, то ты лишь удружил через ЧТД.


Ты себе что-то на придумывал и пытаешься это обосновать любыми путями.

V>А как ты отличаешь value-тип от ссылочного?


Как кота от кошки. Смотрю value-тип — говорю — "value-тип".

V>Т.е. вопрос в следующем: а как эти значения этих типов передаются в кач-ве аргументов функций — по ссылке или по-значению?


Не имеет значения. Передать вэлью-значение по ссылке не особо проблематично. Это детали реализации.

V>Надеюсь, суть вопроса понятна?


Понятна. Пытаешься придумать обосновании явно неверному утверждению.

V>1. Было сказано "в ФП языках".


Язык не имеет значения.

V>2. Variant не описан средствами VB, а "дан сверху", т.е. является встроенным для него.


Опять же не имеет значения.

V>Я тебе больше скажу. Генератор CORBA IDL или COM IDL генерит размеченные объединения как value-типы для С++.

V>Одно плохо — CORBA это тоже не про ФП-языки.

Ты себе придумал какой-то странный ценз "ФП-языки". Он только тебе интересен.

V>В общем, в двух словах. Не столько для тебя, сколько для читателей.


Ну, да. Как всем же ясно что ты прав и они хотят у гуру поучиться.

V>Основная фишка тут в том, что реализация объединения через условный value-тип будет занимать в памяти такой же размер, какой нужен для представления самого большого из вариантов + дискриминатор.


Ой-йо-йо. Великое горе! А любой объект в дотнете занимает 24 байта (под x64). И стало быть перерасход 1-2 интов не такая уж проблема. А там еще локальность памяти подтягивается, затраты на занятие памяти в куче и в друг оказывается, что потеря этих байтов просто фигня по сравнению с выигрышем.

Вот так и с ValueOption оказывается, что потеря 1-4 байта (занимаемого bool-ом в зависимости от выравнивания) — это ни что по сравнению с затратами на ссылочные типы.

VD>>Тот же Котлин, хотя и использует нулевую ссылку каксэ отсутствующее значение, интерпретирует, например, string и string? как разные типы. Это позволяет компилятору контролировать ошибки связанные с null–ами.


V>А тут не верно.


Только по-твоему.

V>Озвученное тобой говорит о том, что система типов Котлина НЕ контроллирует значение ссылочного типа, поэтому просто добавила ДРУГОЙ тип для non-nullable-ссылок.


Не говори ерунды. Система типов нигде значения не контролирует, так как значения сущность времени исполнения. Зато она контролирует отсутствие ошибок с этими значениями.

V>То, что в синтаксисе языка наоборот — т.е. как бэ nullable-тип видится как "другой" — это ж просто трюк такой, верно?


Какие на фиг трюки? Это система типов языка. Для этого языка это разные, хотя и связанные типы. Учись мыслить абстрактно. Система типов языка может отличаться от системы типов базовой платформы.

V>А так-то похожий трюк с введением ДРУГОГО типа я тоже в С++ тоже периодически делаю.


Да это где угодно можно. Вопрос лишь в удобстве использовании и загрузки компилятора ненужной работой.

В том же Колине кроме разведения типов еще есть ряд фич упрощающих жизнь с этим. Иначе эта была бы адова боль, а не работа.

Так у них можно проверить в if-е значение на null и компилятор сам подменит тип внутри true-секции этого if-f. Оберткой это не сделаешь. Или можно? Далее для null-абл значений есть лифтинг. Например, написав optionX?.Foo мы получим значение Foo поднятое в null-абл тип. И это можно проделывать сколько угодно долго. А потом можно просто проверить результат один раз или использовать оператор замены null-значений. Еще они проводят анализ библиотек Явы и вычисляют функции точно не возвращающие нулабл-типы. Всего этого на обертках не добьешся. В итоге получается разный класс решений. У тебя это примочка вызывающая боль при использовании, а у них стройная система.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.