Ignora i problemi di rendimento, sono interessante nel flusso di dati, sicurezza, modellazione, ragionamento.
Mi chiedo quali sono le limitazioni dell'approccio alle eccezioni alla segnalazione degli errori implementate come in Java rispetto a Haskell-like (OCaml e Rust usano lo stesso approccio / simile AFAIK).
Per quanto ne so in entrambi i casi, l'errore fa parte della firma della funzione, ma in Haskell devi "gestire" esplicitamente l'errore anche se l'intera "gestione" lo sta solo superando. Vedo una differenza per il lettore, in Java:
try
{
a = foo();
b = bar();
}
è impossibile dirlo (solo guardando il codice) se foo
e / o bar
possono finire con errori, anche in entrambi i casi l'errore può essere passato silenziosamente. Se capisco correttamente in Haskell, il codice della controparte verrebbe messo in monad:
do a <- foo();
b = bar();
(Sono nuovo di Haskell, quindi perdonami gli errori) ed è chiaro dove si verifica la caduta e quale linea può fallire.
MA - questo è per umani, il compilatore lo sa in entrambi i casi.
Quindi, quando si tratta, ad esempio, di ragionare sul flusso di dati (per il compilatore, non umano), quali sono i limiti dell'approccio Java? In altre parole, cosa non è fattibile in Java che è possibile in Haskell? O quali informazioni ha Haskell che non è presente in Java?