¿Por qué las expresiones de cálculo de F # requieren un objeto generador (en lugar de una clase)?

Las expresiones de cálculo F # tienen la sintaxis:

ident { cexpr }

Dóndeident es el objeto constructor (esta sintaxis se toma deEntrada de blog de Don Syme 2007).

En todos los ejemplos que he visto, los objetos del constructor son instancias singleton, y sin estado para arrancar. Don da el ejemplo de definir un objeto constructor llamadoattempt:

let attempt = new AttemptBuilder()

Mi pregunta: ¿Por qué F # no usa simplemente elAttemptBuilder ¿Clase directamente en expresiones computacionales? Seguramente la notación podría ser desclasificada a llamadas de método estáticas tan fácilmente como llamadas de método de instancia.

El uso de un valor de instancia significa que uno podría, en teoría, crear una instancia de múltiples objetos de constructor de la misma clase, supuestamente parametrizados de alguna manera, o incluso (cielo prohibido) con un estado interno mutable. Pero no puedo imaginar cómo sería útil eso alguna vez.

Actualizar: La sintaxis que cité anteriormente sugiere que el constructor debe aparecer como un único identificador, lo que es engañoso y probablemente refleja una versión anterior del idioma. El más recienteEspecificación del lenguaje F # 2.0 define la sintaxis como:

expr { comp-or-range-expr }

lo que deja en claro que cualquier expresión (que se evalúe como un objeto generador) puede usarse como el primer elemento de la construcción.

Respuestas a la pregunta(3)

Su respuesta a la pregunta