Оба являются терминами, тип которых является пересечением всех типов (необжитых). Оба могут быть переданы в коде без сбоев, пока вы не попытаетесь их оценить. Единственное отличие, которое я вижу, это то, что в Java есть лазейка, которая позволяет оценивать null
для одной операции, которая является сравнительным сравнением равенства (==
), тогда как в Haskell undefined
не может быть оценивается вообще, не вызывая исключения. Разве это единственная разница?
Изменить
То, что я действительно пытаюсь решить с этим вопросом, заключается в том, почему в Java было такое null
такое явно плохое решение, и как Haskell избегает его? Мне кажется, что реальная проблема заключается в том, что вы можете сделать что-то полезное с помощью null
, а именно, вы можете проверить его на nullness. Поскольку вам разрешено это делать, стало стандартным соглашением обходить нулевые значения в коде и указать им "нет результата" вместо "в этой программе есть логическая ошибка". Принимая во внимание, что в Haskell нет способа проверить, оценивает ли термин дно, не оценивая его и взрыва программы, поэтому он никогда не может использоваться таким образом, чтобы указывать "нет результата". Вместо этого один вынужден использовать что-то вроде Maybe
.
Извините, если мне кажется, что я играю быстро и свободно с термином "оценивать"... Я пытаюсь провести здесь аналогию и нечаянно сформулировать его. Я предполагаю, что признак того, что аналогия неточна.