Como converter implicitamente em supertipos comuns em correspondências de padrões de F #?
Resumo do Problema
No momento em que estou usando f #, devo coagir explicitamente um valor ao tipo pai de seu tipo para fazer com que as expressões de correspondência de padrões digitem a verificação corretamente. Idealmente, gostaria de uma maneira mais clara de agir.
Exemplo
Suponha que eu tenha alguma hierarquia de classe:
type Foo () =
abstract member Value : unit -> string
type A (i:int) =
inherit Foo ()
override this.Value () = i.ToString()
type B (s:string) =
inherit Foo ()
override this.Value () = s
Idealmente, e em algumas linguagens de programação normalmente, eu escreveria o equivalente ao seguinte:
let bar (i:int) : Foo =
match i with
| 1 -> B "one"
| _ -> A i
No entanto, isso falha ao digitar a verificação corretamente, dando-me o erro: "Era esperado que essa expressão tivesse o tipo Foo, mas aqui o tipo B". Não entendo por que o compilador não possui informações suficientes para inferir um supertipo comum para a expressão de correspondência e, em seguida, verifique se o supertipo comum é 'Foo'.
No momento, sou forçado a fornecer uma coerção explícita para todos os casos na correspondência de padrões:
let bar2 (i:int) : Foo =
match i with
| 1 -> (B "one") :> Foo
| _ -> (A i) :> Foo
Eu gostaria de evitar isso.
Notas adicionais
A intuição sugere que isso é resultado de uma questão mais geral. Eu teria pensado, no entanto, que algo tão comum quanto a correspondência de padrões ou declarações que também exibem a mesma propriedade teriam uma regra de verificação de tipo para contabilizar super tipos comuns.Antes que alguém sugira - eu aprecio que se A ou B fossem expressões de objeto, isso funcionaria, mas meu exemplo real é a criação de instâncias de classes C # nas quais elas são classes normais.Existe uma maneira de declarar funções para converter implicitamente tipos, como por exemplo o scala, para que eu pudesse aplicar conversões automáticas para o módulo em que estou gerando esta geração?Obrigado por qualquer ajuda sobre este assunto.