¿Existe alguna forma recomendada de modelar múltiples niveles de herencia en F #, presumiblemente utilizando una unión discriminada?Modelado de niveles múltiples de herencia mediante uniones discriminadas
Tomando algo como lo siguiente en C#:
class Expr { }
class SourceExpr : Expr { }
class JoinExpr : SourceExpr { }
class TableExpr : SourceExpr { }
que he hecho esto en C#:
type SourceExpr =
| Join of JoinExpr
| Table of TableExpr
type Expr =
| Source of SourceExpr
| ...
¿Hay una mejor manera? ¿Esto proporciona el mismo comportamiento polimórfico que la herencia?
Estoy trabajando en un analizador sintáctico, por lo que creo que los DU son la elección correcta. Pero hay expresiones que parecen heredar de otros. Hay funciones que deberían aceptar una combinación o tabla, que son ambas fuentes. También hay funciones que deberían aceptar un Expr, de los cuales Source es una de las muchas opciones. No puedo dejar de pensar en términos de OO, pero me pregunto si existe una mejor manera de modelar esta jerarquía relativamente estática mientras se mantiene el mismo tipo de comportamiento polimórfico. – Daniel
Modelarlo con tipos funcionará bien. Si tiene dos tipos que son "también" lo mismo, agregue un nuevo tipo que discrimine entre ellos y use eso. El único inconveniente es que tendrás que hacer más deconstrucción, pero la coincidencia de patrones y los patrones activos donde los necesites lo hacen bastante tolerable. Estoy haciendo esto con algunos tipos recursivos bastante complicados y un analizador FParsec y funciona bastante bien. –