Las uniones discriminadas F # corresponden a las jerarquías de clase OO bastante de cerca, por lo que esta es probablemente la mejor opción. La diferencia más notable es que no puede agregar nuevos casos a una unión discriminada sin modificar la declaración de tipo. Por otro lado, puede agregar fácilmente nuevas funciones que funcionen con el tipo (que corresponde aproximadamente a la adición de nuevos métodos virtuales en C#).
Por lo tanto, si no espera agregar nuevas clases heredadas (casos), esta es la mejor opción. De lo contrario, puede usar tipos de objetos F # (u otras opciones, dependiendo del escenario).
Un punto más con respecto a su código, ya que no puede agregar casos nuevos, el compilador de F # sabe que los únicos casos que necesita son B
y C
. Como resultado, la block_3
no se puede ejecutar, lo que significa que se puede escribir simplemente:
let my_fct x =
match x with
| B -> (block_1)
| C -> (block_2)
Supongo que está bien. Excepto que estás perdido; después de block_1, block_2 y block_3 –
Disculpe mi ignorancia, pero parece que 'block_3' nunca se puede ejecutar en el fragmento F # (los tipos de datos algebraicos están" cerrados "hasta donde yo sé), entonces ¿por qué está ahí? Además, ¿soy el único que piensa que la traducción debería usar polimorfismo? – delnan
Absolutamente todos tienen razón sobre block_3. – Hugo