В чем разница между undefined в Haskell и null в Java?

Оба термина, тип которых является пересечением всех типов (необитаемый). Оба могут быть переданы в коде без сбоев, пока кто-то не попытается их оценить. Единственное различие, которое я вижу, заключается в том, что в Java есть лазейка, которая позволяет вычислить null ровно для одной операции, которое является сравнительным сравнением равенства ( == ) - тогда как в Haskell undefined не может быть вычислено вообще без исключения исключения. Это единственная разница?

Edit

Я действительно пытаюсь ответить на этот вопрос: почему включение null в Java было таким явно плохим решением и как избежать Haskell Это? Мне кажется, что настоящая проблема в том, что вы можете сделать что-то полезное с null , а именно вы можете проверить его на нулевое значение . Поскольку вам это разрешено, стало стандартным соглашением передавать в коде нулевые значения и указывать на них «нет результата» вместо «в этой программе есть логическая ошибка». В то время как в Haskell там ' Нет способа проверить, оценивается ли термин до дна, не оценив его и не взорвав программу, поэтому его нельзя использовать таким образом, чтобы указать «нет результата». Вместо этого приходится использовать что-то вроде Может быть .

Извините, если мне кажется, что я теряю слово "оценивать" ... Я пытаюсь провести здесь аналогию и возникли проблемы с его точным выражением. Думаю, это признак того, что аналогия неточна.

50
задан Don Stewart 16 April 2011 в 09:22
поделиться