Enumerations, also known as enums, are integral types where labels are assigned to a subset of the values. You can use them in place of literals to make code more readable and maintainable.
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
The following code shows the declaration of an enumeration.
type Category =
| Sports = 0
| Arts = 1
| Clothing = 2
| Electronics = 3
| HealthCare = 4
An enumeration looks much like a discriminated union that has simple values, except that the values can be specified. The values are typically integers that start at 0 or 1, or integers that represent bit positions.
When you refer to the named values, you must use the name of the enumeration type itself as a qualifier, that is, enum-name.value1, not just value1.
let electronicsCat = Category.Electronics
Console.WriteLine(electronicsCat)
You can easily convert enumerations to the underlying type using the appropriate operator, as shown in the following code.
let electronicsCat = Category.Electronics
let intValue = int electronicsCat
Console.WriteLine("{0}: {1}",electronicsCat, intValue)
sbyte, byte, int16, uint16, int32, uint32, int64, uint16, uint64, and char.System.Enum, which in turn is inherited from System.ValueType.The enum function in the F# library can be used to generate an enumeration value, even a value other than one of the predefined, named values.
You use the enum function as follows.
let cat4 = enum<Category>(4)
Console.WriteLine("{0}: {1}",cat4, 4)
The default enum function works with type int32. Therefore, it cannot be used with enumeration types that have other underlying types.
You can use the Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue method if you are other than int32.
type uCategory =
| Sports = 0u
| Arts = 1u
| Clothing = 2u
| Electronics = 3u
| HealthCare = 4u
let cat2 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uCategory>(2u)
Console.WriteLine("{0}: {1}",cat2, 2u)