Ma ciò sembra troppo artificiale, dimostra chiaramente che "F # è contro try/with/finally". Perché?
Immagino che F # potrebbe essere "contro" l'eccezione di gestione a tutti. Per motivi di interoperabilità .NET, deve supportarli, ma in pratica, non esiste alcuna gestione delle eccezioni * nella programmazione funzionale.
Eccezioni di lancio/cattura significa eseguire "salti verso il nulla" che non sono nemmeno notati dal sistema di tipi che è fondamentalmente contrario alla filosofia funzionale.
È possibile utilizzare il codice puramente funzionale (monadico) per avvolgere le eccezioni. Tutti gli errori sono gestiti attraverso i valori, in termini del sistema di tipi sottostante e senza salti/effetti collaterali.
Invece di scrivere una funzione
let readNumber() : int = ...
che possono generare eccezioni arbitrari, sarà sufficiente dichiarate
let readNumber() : int option = ...
che rende questo punto automaticamente chiaro la sua firma tipo.
* Ciò non significa che non gestiamo situazioni eccezionali, si tratta solo del tipo di gestione delle eccezioni in .NET/C++.
È artificiale? Vedo solo una parola chiave a tre lettere ridondante. Il C++ non viene accusato di essere "contro le variabili" perché devi scrivere un "int" ridondante. Inoltre, non sono sicuro di come si utilizzino le eccezioni, ma quando sono in programmazione, le eccezioni non riguardano la registrazione. Se hai un valore da offrire al livello in cui ti trovi quando si verifica un'eccezione, restituisci quel valore, altrimenti, fai più in alto l'eccezione, ma non vedo quale operazione abbia a che fare con esso ... –
@Pascal Cuoq: per favore non fare supposizioni su ** come ** io uso le eccezioni. Se voglio registrare un'eccezione per qualsiasi motivo, non implica automaticamente che io usi le eccezioni per la registrazione, come il tuo commento implica che io faccia. Inoltre, questa non è una domanda su COME gestire un'eccezione e COSA FARE, ma è semplicemente (come indicato 2 volte nella domanda): ** PERCHÉ il supporto di F # non prova con/finally **? –