Есть ли способ для меня, чтобы полностью определить дискриминационный путь союза?
Есть ли способ для меня, чтобы полностью определить дискриминационный путь союза?
В настоящее время у меня есть это:
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
,