Qual é a diferença entre indefinido em Haskell e nulo em Java?

Ambos são termos cujo tipo é a interseção de todos os tipos (desabitado). Ambos podem ser transmitidos no código sem falhar até que se tente avaliá-los. A única diferença que vejo é que, em Java, existe uma brecha que permitenull a ser avaliado para exatamente uma operação, que é a comparação de igualdade de referência (==) - enquanto que em Haskellundefined não pode ser avaliado de maneira alguma sem gerar uma exceção. Essa é a única diferença?

Editar

O que estou realmente tentando entender com essa pergunta é: por que incluirnull em Java, uma decisão aparentemente tão ruim, e como Haskell a escapa? Parece-me que o verdadeiro problema é que você pode fazer algoútil comnull, ou seja, você pode verificá-lonulidade. Como você tem permissão para fazer isso, tornou-se uma convenção padrão passar valores nulos no código e indicar que "nenhum resultado" em vez de "existe um erro lógico neste programa". Considerando que, em Haskell, não há como verificar se um termo é avaliado até o final sem avaliá-lo e o programa explodir; portanto, ele nunca poderia ser usado de maneira a indicar "nenhum resultado". Em vez disso, alguém é forçado a usar algo comoMaybe.

Desculpe se parece que estou jogando rápido e solto com o termo "avaliar" ... estou tentando fazer uma analogia aqui e tendo problemas para formular com precisão. Eu acho que é um sinal de que a analogia é imprecisa.

questionAnswers(2)

yourAnswerToTheQuestion