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.

questionAnswers(2)

yourAnswerToTheQuestion