Я не думаю, что полезно говорить о нуле вне контекста всего языкового дизайна. Первый момент путаницы: пустой ли тип null или он содержит одно уникальное значение (часто называемое «ноль»)? Полностью пустой тип не очень полезен - хотя C использует пустой тип возврата void
, чтобы пометить процедуру, которая выполняется только для побочного эффекта, многие другие языки используют для этой цели одноэлементный тип (обычно пустой кортеж).
Я считаю, что значение nil наиболее эффективно используется в динамически типизированных языках. В Smalltalk это значение используется, когда вам нужно значение, но у вас нет никакой информации. В Lua это используется еще более эффективно: значение nil является единственным значением, которое не может быть ключом или значением в таблице Lua. В Lua nil также используется как значение отсутствующих параметров или результатов.
В целом, я бы сказал, что nil значение может быть полезно в динамически типизированной настройке, но в статически типизированной настройке нуль type полезен только для разговоров о функциях ( или процедуры или методы), которые выполняются для побочного эффекта.
Любой ценой избегайте указателя NULL
, используемого в C и Java. Это артефакты, присущие реализации указателей и объектов, и в хорошо спроектированном языке они не должны допускаться. Обязательно предоставьте своим пользователям способ расширить существующий тип с нулевым значением, но нарочно заставьте их делать это явно - не заставляйте каждый тип иметь его случайно. (В качестве примера явного использования я недавно реализовал троичные деревья поиска Bentley и Sedgewick в Haskell, и мне нужно было расширить тип символа еще одним значением, означающим «не символ». Для этой цели Haskell предоставляет тип Maybe
. )
Наконец, если вы пишете компилятор, полезно помнить, что самые легкие части языка для компиляции и те части, которые вызывают наименьшее количество ошибок, это части, которых нет: -)