Pero eso parece demasiado artificial, demuestra claramente que "F # está contra try/with/finally". ¿Porqué es eso?
Supongo que F # podría ser "contra" el manejo de excepciones en absoluto. Por el bien de la interoperabilidad .NET, tiene que soportarlos, pero básicamente, no hay manejo de excepciones * en la programación funcional.
Lanzar/atrapar excepciones significa realizar "saltos a ninguna parte" que ni siquiera son notados por el sistema de tipos que es fundamentalmente contrario a la filosofía funcional.
Puede usar código puramente funcional (monádico) para ajustar excepciones. Todos los errores se manejan a través de valores, en términos del sistema de tipos subyacente y sin saltos/efectos secundarios.
En lugar de escribir una función
let readNumber() : int = ...
que pueden lanzar excepciones arbitrarias, podrás limitan a afirmar
let readNumber() : int option = ...
lo que hace que este punto borrará automáticamente por su declaración de tipo.
* Esto no significa que no manejemos situaciones excepcionales, es solo el tipo de manejo de excepciones en .NET/C++.
¿Es artificial? Solo veo una palabra clave redundante de tres letras. C++ no es acusado de estar "en contra de las variables" porque tiene que escribir un "int" redundante. Además, no estoy seguro de cómo se usan las excepciones, pero cuando estoy programando, las excepciones no son para el registro. Si tiene un valor para ofrecer en el nivel en el que se encuentra cuando ocurre una excepción, devuelva ese valor; de lo contrario, permita que la excepción suba aún más, pero no veo qué registro tiene que ver con eso ... –
@Pascal Cuoq: por favor, no hagas suposiciones sobre ** cómo ** utilizo las excepciones. Si deseo registrar una excepción por cualquier motivo, no implica automáticamente que use excepciones para el registro, ya que su comentario implica que sí. Además, esta no es una pregunta sobre CÓMO manejar una excepción y QUÉ HACER, pero es simplemente (como se dijo dos veces en la pregunta): ** ¿POR QUÉ no admite F/try/with/finally **? –