было бы разумно разрешить привязку «позволять» внутри дискриминационных союзов. Я думаю, что причина, по которой это невозможно, заключается в том, что дискриминационные союзы по-прежнему основаны на дизайне OCaml, а объекты приходят из мира .NET. F # пытается объединить эти два в максимально возможной степени, но это могло бы пойти дальше.
В любом случае, мне кажется, что вы используете дискриминационное объединение только для реализации некоторого внутреннего поведения типа AI_Choose
. В этом случае вы можете объявить различающееся объединение отдельно и использовать его для реализации типа объекта.
Полагаю, вы могли бы написать что-то вроде этого:
type AiChooseOptions =
| AI_Priority of list<AI> * Condition
| AI_Weighted_Priority of list<AI * float> * Condition
type AiChoose(aiOptions) =
let mutable chosen = Option<AI>.None
member this.Choose() =
match aiOptions with
| AI_Priority(aiList, condition) -> (...)
| AI_Weighted_Priority(aiList, condition) -> (...)
member this.Chosen (...)
interface AI with (...)
Ключевое различие между иерархией классов и дискриминационными объединениями заключается в том, что касается расширяемости. Классы облегчают добавление новых типов, в то время как различимые объединения облегчают добавление новых функций, которые работают с типом (в вашем случае AiChooseOptions), поэтому, вероятно, это первое, что следует учитывать при разработке приложения.