Существуют ли языки без "null"?

Есть много людей, которые считают, что понятие специального значения null (поскольку оно используется в lanuages, например C, Java, С#, Perl, Javascript, SQL и т.д.) - плохая идея. Есть несколько вопросов об этом на SO и P.SE, например Лучшее объяснение для языков без нулевого значения и Действительно ли нулевые ссылки плохая вещь?.

Однако я не мог найти какой-либо язык, который будет работать без них. Все языки, с которыми я знаком, имеют null или что-то подобное (например, "undefined" в Perl).

Я понимаю, что каждый язык должен каким-то образом выражать "отсутствие ценности". Однако вместо "null" или "undefined" это также можно сделать явным, используя что-то вроде Maybe (Haskell) или Optional (Guava). Основное отличие от наличия "null" или "undefined" заключается в том, что объект может иметь только "нет значения", если он имеет определенный тип (возможно, необязательно...). Напротив, "null" / "undefined" обычно является допустимым значением для каждого типа.

Существуют ли какие-либо языки, которые не имеют "нулевого" или аналогичного понятия в этом смысле?

Ответ 1

Здесь неполный список языков без null/undefined/nothing в том смысле, который вы описали, упорядоченный по году первого появления в соответствии с Википедией.

  • С# 8 будет иметь обнуляемые ссылочные типы.
  • Пролог. Логическая переменная означает "что угодно". Нет понятия "ноль" или "undefined".
  • Пони (до 1.0.0). Использует тип объединения, где одним из типов является None.
  • Crystal (на стадии альфа): имеет nil, но предотвращает все исключения нулевого указателя во время компиляции.
  • Котлин (2015): есть дополнительные типы с ? синтаксис.
  • Swift (2014): есть дополнительные типы с ? синтаксис.
  • Hack (2014): есть дополнительные типы с ? синтаксис.
  • TypeScript (2012): имеет типы объединения, которые могут иметь undefined или null вариант.
  • Вяз (2012): имеет профсоюзный тип Maybe.
  • Цейлон (2011): есть дополнительные типы с ? синтаксис.
  • Rust (2010): имеет необязательный тип Option.
  • Fantom (2005): есть дополнительные типы с ? синтаксис.
  • F # (2005): Имеет тип союза Option.
  • Ницца (2003): есть дополнительные типы с ? синтаксис.
  • OCaml (1996): Имеется option типа объединения.
  • Haskell (1990): имеет профсоюзный тип Maybe.
  • Стандарт ML (1990): Имеется option типа соединения.
  • Tcl (1988)

Не стесняйтесь дополнять список.

Ответ 2

Tcl не имеет понятия о нулевом значении. Все значение является значением, и все значения имеют строковое представление (обычно суммируются как "Все является строкой" ).

Ближайшей вещью для null является пустая строка.

Чтобы передать концепцию "нет ценности", требуется определенное творчество.

Конечно, как упоминалось выше, некоторые люди используют пустую строку для обозначения никакого значения. Чтобы это сработало, пустые строки не могут быть действительными в наборе данных, который вы обрабатываете. Удивительно, но в эту категорию попадает много реальных данных.

Другой способ указать отсутствие значения - просто выбросить ошибку. В некоторых случаях это именно то, что должно было быть сделано вместо того, чтобы возвращать некоторое значение null или ошибки (анти-шаблон, полученный из C, и привычка, которую трудно избавиться).

Еще один способ - вернуть пустой список (список - эквивалент Tcl массивов на других языках). Строковое представление пустого списка - это пустая строка. Но, к счастью, строковое представление списка, содержащего пустую строку, состоит из двух двойных кавычек: "\"\"". Это различие позволяет различать список, содержащий "ничего", и список, содержащий строку, в которой нет символов.

Наконец, некоторые люди просто указывают на отсутствие значений, просто не объявляя переменную (или неявную ее, что является вещью в tcl). Это может показаться странным, поскольку переменные кажутся конструкцией времени компиляции (в то время как значения представляют собой конструкцию времени выполнения), но в tcl все время выполнения. Таким образом, код может использовать не существование переменной в качестве сигнала. Попытка прочитать необъявленную переменную приводит к ошибке, которую вы можете поймать. Кроме того, Tcl также позволяет использовать интроспекцию для проверки состояния интерпретатора. Поэтому вы можете использовать [info exist x], чтобы проверить, существует ли переменная с именем x.

Ответ 3

Вы уже упоминаете Haskell как пример языка без "null". Существуют также языки в семействе ML, такие как Standard ML, OCaml или F #. Многие языки с динамическим типизированием также не содержат указателей на нуль, схема будет хорошим примером.