У меня есть конечное множество вещей одного типа, и я хочу представить их строго типизированным способом. Я хотел бы иметь возможность манипулировать полным набором и легко извлекать элементы. Вот один из способов:
type Planet = Mercury | Venus | Earth
type PlanetInfo = { Diameter: float }
let planets =
Map [ Mercury, { Diameter = 100. }
Venus, { Diameter = 200. }
Earth, { Diameter = 300. } ]
let venusDiameter = planets.[Venus].Diameter
Положительные стороны этого метода:
- Есть ровно три
Planet
, как определено размеченным объединением. - У нас есть весь набор на карте
planets
, которым можно манипулировать, повторять и т. д. planets.[Mars]
вызовет ошибку, потому что Марс неPlanet
.
Но с другой стороны:
- Между союзом и картой не обязательно должно быть однозначное отображение. Необходимость упомянуть каждую планету дважды является недостатком. Вот еще один метод, который касается последнего пункта:
type Planet = { Name: string; Diameter: float }
let planets =
[ { Name = "Mercury"; Diameter = 100. }
{ Name = "Venus"; Diameter = 200. }
{ Name = "Earth"; Diameter = 300. } ]
|> List.map (fun e -> e.Name, e)
|> Map
let venusDiameter = planets.["Venus"].Diameter
Итак, теперь каждая планета упоминается только в одном месте, но planets.["Mars"]
не вызывает ошибки времени компиляции, потому что идентификаторы планет теперь печатаются строками.
Есть ли способ сделать это, который имеет все четыре хороших момента?