F # различимые союзы достаточно близко соответствуют иерархиям классов OO, так что это, вероятно, лучший вариант. Самым заметным отличием является то, что вы не можете добавлять новые случаи в различаемое объединение без изменения объявления типа. С другой стороны, вы можете легко добавлять новые функции, которые работают с типом (что примерно соответствует добавлению новых виртуальных методов в C #).
Итак, если вы не ожидаете добавления новых унаследованных классов (падежей), тогда это лучший вариант. В противном случае вы можете использовать типы объектов F # (или другие параметры, в зависимости от сценария).
Еще один момент, касающийся вашего кода - поскольку вы не можете добавлять новые случаи, компилятор F # знает, что вам нужны только случаи для B
и C
. В результате, block_3
никогда не может быть выполнен, что означает, что вы можете написать просто:
let my_fct x =
match x with
| B -> ( block_1 )
| C -> ( block_2 )