Por que as expressões de computação F # exigem um objeto de construtor (em vez de uma classe)?
Expressões de computação F # têm a sintaxe:
ident { cexpr }
Ondeident
é o objeto construtor (essa sintaxe é retirada deEntrada de blog de 2007 de Don Syme).
Em todos os exemplos que vi, os objetos de construtor são instâncias singleton e stateless para inicializar. Don dá o exemplo de definir um objeto construtor chamadoattempt
:
let attempt = new AttemptBuilder()
Minha pergunta: Por que o F # não usa apenas oAttemptBuilder
classe diretamente em expressões de computação? Certamente, a notação poderia ser dessacralizada para chamadas de método estático tão facilmente quanto as chamadas de método de instância.
Usar um valor de instância significa que, em teoria, é possível instanciar vários objetos de construtor da mesma classe, presumivelmente parametrizados de alguma forma, ou até mesmo (que o céu proiba) com estado interno mutável. Mas não consigo imaginar como isso seria útil.
Atualizar: A sintaxe que citei acima sugere que o construtor deve aparecer como um único identificador, o que é enganoso e provavelmente reflete uma versão anterior da linguagem. O mais recenteEspecificação de linguagem do F # 2.0 define a sintaxe como:
expr { comp-or-range-expr }
o que deixa claro que qualquer expressão (que avalia um objeto construtor) pode ser usada como o primeiro elemento da construção.