Есть ли способ для меня, чтобы полностью определить дискриминационный путь союза?

Есть ли способ для меня, чтобы полностью определить дискриминационный путь союза?

В настоящее время у меня есть это:

type PostionOfScott =
    | ScottOnFirst
    | ScottOnSecond
    | ScottOnThird

type PostionOfBrian =
    | BrianOnFirst
    | BrianOnSecond
    | BrianOnThird

type PostionOfCherice =
    | ChericeOnFirst
    | ChericeOnSecond
    | ChericeOnThird

Я хотел бы сделать это:

type PostionOfScott =
    | First
    | Second
    | Third

type PostionOfBrian =
    | First
    | Second
    | Third

type PostionOfCherice =
    | First
    | Second
    | Third

Тем не менее, когда я предоставляю следующий код:

(*Functions*)
let hit play batterUp =

    match batterUp with
    | ScottAtBat   -> match play with
                      | Single  -> Scott First
                      | Double  -> Scott Second
                      | Tripple -> Scott Third

Я получаю следующую ошибку:

Ошибка Это выражение должно иметь тип PostionOfScott, но здесь имеет тип PostionOfCherice

Я понимаю, что на последний объявленный дискриминируемый тип объединения будут ссылаться, если есть какая-то двусмысленность.

Тем не менее, есть ли способ для меня, чтобы полностью определить дискриминационный путь союза? Следовательно, я хочу уменьшить словоблудие в моих случаях объединения.

2 ответа

Решение

Я думаю, что повторение определения типа позиции для каждого игрока, вероятно, не лучший выбор дизайна. Было бы более разумно разделить эти вещи, и тогда ваша проблема исчезнет естественным образом.

type Position =
    | First
    | Second
    | Third

type Player =
    | Scott
    | Brian
    | Cherice

type PlayerPosition = {Player : Player; Position : Position}

Тогда вы можете сопоставить шаблон:

let hit play batterUp =
    match batterUp with
    |{Player = Scott; Position = First} -> ...

Похоже, вы ищете атрибут RequireQualifiedAccess.

[<RequireQualifiedAccess>]
type PositionOfScott =
    | First
    | Second
    | Third

С этим вам нужно будет использовать PositionOfScott.First вместо First вне PositionOfScott члены. Очень полезно для союзов с обычно неописуемыми значениями, такими как Yes или же Any,

Другие вопросы по тегам