Здравствуйте, x-code, Вы писали:
XC>1. Является ли нулевая ссылка на объект эквивалентом None? Можно ли сказать что нуллабельные ссылочные типы это полноценная реализация опциональных типов?
XC>2. Если у объекта некоторого класса имеется свое собственное, определенное программистом "недействительное" состояние, то может ли это быть то же самое что и None? Кажется что это разные вещи, по крайней мере в сравнении с "нулевой ссылкой": в случае нулевой ссылки объекта просто нет, поэтому невозможно обратиться ни к каким полям и т.д.; в случае пользовательского недействительного состояния недействительность чисто логическая, при этом память под объект есть, поля есть и к ним можно обратиться, можно перевести объект в действительное состояние вызвав какой-то метод и т.д.
XC>Но в то же время такое "пользовательское недействительное состояние" ближе к классической реализации Optional<T>, где для хранения признака None просто заводится булевский флаг, при этом память под объект Some<T> физически также присутствует.
XC>3. В частности, для чисел с плавающей точкой, является ли NaN эквивалентом None? Или это логически разные понятия и их не следует смешивать? Если разные то почему?
Все пункты являются. Но есть важное отличие. У нулябельной ссылки есть "неявный оператор приведения" к целевому типу, который кидает исключение (или валит программу) в случае NULL-а, в большинстве ЯП. То же про float и пользовательский тип. Это большой недостаток. Если он исправлен (например в Kotlin так), тогда вообще проблем нет. Разве что желательны какие-то утилитные методы над этим нулябельным типом вроде map, чтобы меньше писать. Т.е. смысл опциональных типов в проверке компилятором, чтобы баги были на уровне системы типов, а если компилятор проверил программу и ошибок не нашёл, значит этих багов там нет.
XC>4. Какой физический смысл у многократного закручивания опционала в опционал? Optional<Optional<T>>, Optional<Optional<Optional<T>>> и т.п.? Где такое может встретиться и для чего?
Some(X), None1, None2, ..., т.е. перечисление с кучей альтернатив. На мой взгляд это признак говнокода, нужно вводить свой тип. Это как возвращать int[] из двух элементов, вместо создания типа Point.