¿Cuál es la diferencia entre indefinido en Haskell y nulo en Java?

Ambos son términos cuyo tipo es la intersección de todos los tipos (deshabitada). Ambos se pueden pasar en código sin fallar hasta que uno intente evaluarlos. La única diferencia que puedo ver es que en Java, hay una laguna que permitenull para evaluar exactamente una operación, que es la comparación de igualdad de referencia (==) - mientras que en Haskellundefined no se puede evaluar en absoluto sin lanzar una excepción. ¿Es esta la única diferencia?

Editar

A lo que realmente estoy tratando de llegar con esta pregunta es, ¿por qué estaba incluyendonull en Java, una decisión aparentemente tan pobre, y ¿cómo escapa Haskell? Me parece que el verdadero problema es que puedes hacer algoútil connull, es decir, puede verificarlonulidad. Debido a que se le permite hacer esto, se ha convertido en una convención estándar pasar valores nulos en el código y hacer que indiquen "ningún resultado" en lugar de "hay un error lógico en este programa". Mientras que en Haskell, no hay forma de verificar si un término se evalúa hasta el fondo sin evaluarlo y el programa explota, por lo que nunca podría usarse de tal manera que indique "ningún resultado". En cambio, uno se ve obligado a usar algo comoMaybe.

Lo siento si parece que estoy jugando rápido y suelto con el término "evaluar" ... Estoy tratando de dibujar una analogía aquí y tengo problemas para redactarla con precisión. Supongo que es una señal de que la analogía es imprecisa.

Respuestas a la pregunta(2)

Su respuesta a la pregunta