У меня нет сомнений, что любой язык, чуть более развитый, чем Тривиль должен быть null safe. Что же касается Тривиля, то здесь не так однозначно. Стоит ли вносить null safety? Будет ли компилятор сложнее? Или проще?
И второй вопрос — а если делать null safe в Тривиле, то как?
Есть два основных подхода (или больше?):
- через разделение nullable и non-nullable типов — Kotlin, Swift, C# (T?)
- через вариантные типы (unions, enums) — Typescript (T | null), Rust (Option based on enums)
Исходя из соображения простоты реализации Тривиля — лучше делать nullable/non-nullable типы. Причем, nullable можно делать только ссылочные типы, расширяя потом в НеТривиле.
Но есть и другое соображение — если объединенная типовая система семейства языков будет включает вариантные типы, то null safety, вроде бы, естественно делать через них. Чтобы потом не переделывать. Или нет?
Например, в Swift есть и enums и nullable типы, то есть, вроде бы, некое излишество.
Итого, главный вопрос — разделять понятия или выражать одно (nullable) через другое (variant types)?
Постоянная ссылка
Да вроде все самые новые языки используют обертку по типу Option / Maybe T. Разве не так? Понятно, что если где-то изначально 10-20-30 лет назад был введен null, от него сложно избавиться, но зачем тащить это в новые языки?
Постоянная ссылка
Вот два новых языка: Kotlin (release 1.0 2016), Swift (release 1.0 2014) которые не используют подход Option/Maybe и являются null safe.
Постоянная ссылка
Kotlin и Swift новые, да не совсем — должны оглядываться на своих доноров, особенно 1-й. Но это не аргумент в пользу Option. Было бы неплохо рассмотреть, чем None лучше Null.
Постоянная ссылка
Вопрос хороший, чем Option/Maybe лучше чем null.
Но я думаю, что null как что-то совершенно самостоятельное и ортогональное, фактически, вынуждает (в силу ортогональности) обрабатывать кейс отсутствия значения ортогональными средствами, иметь эти средства в языке (проверки/паттерны типа is null, спец. операторы типа `??`, `?.` и элвиса `?:` , etc). Вот прям специальные операторы именно для null и ни для чего больше.
А Option/MayBe это просто union-type, который сегодня все равно осознан как совершенно необходимый, и все средства работы с union type сразу оказываются подходящими и для кейса None. Просто тупо меньше концепций, и это вроде как лучше. Так что я скорее бы спросил, а есть ли хоть что-то чем null лучше None?
Хотя, конечно, все равно спец-поддержка в виде того или иного синтаксического сахара добавляется для удобства, из-за частоты использования именно Option. Например, в Rust — это оператор `?` для быстрого возврата None.
Постоянная ссылка
Подобная безопасность может быть полезна. Это уменьшит количество необходимых тестов. Я предлагаю такую форму:
дано
пи : дробное? = 3.141592635;
И соответственно, должен быть метод на проверку:
фн ПлощКруга(рад:дробное):дробное, ошибка{
дано
площ: дробное?;
если рад<0{
вернуть пусто, фмт.Ошибкаф("ПлощКруга(): рад(%рад) меньше нуля")
}
площ:=рад*рад;
вернуть рад;
}