Объединения или различимые объединения позволяют создавать сложные структуры данных, представляющие четко определенный набор вариантов. Например, вам нужно построить реализацию переменной выбора , которая имеет два значения yes и no. Используя инструмент Unions, вы можете создать это.
Синтаксис
Дискриминационные союзы определяются с использованием следующего синтаксиса —
type type-name = | case-identifier1 [of [ fieldname1 : ] type1 [ * [ fieldname2 : ] type2 ...] | case-identifier2 [of [fieldname3 : ]type3 [ * [ fieldname4 : ]type4 ...] ...
Наша простая реализация, выбор, будет выглядеть следующим образом:
type choice = | Yes | No
В следующем примере используется выбор типа —
type choice = | Yes | No let x = Yes (* creates an instance of choice *) let y = No (* creates another instance of choice *) let main() = printfn "x: %A" x printfn "y: %A" y main()
Когда вы компилируете и запускаете программу, она выдает следующий вывод:
x: Yes y: No
Пример 1
В следующем примере показана реализация состояний напряжения, которые устанавливают бит на высокий или низкий уровень.
type VoltageState = | High | Low let toggleSwitch = function (* pattern matching input *) | High -> Low | Low -> High let main() = let on = High let off = Low let change = toggleSwitch off printfn "Switch on state: %A" on printfn "Switch off state: %A" off printfn "Toggle off: %A" change printfn "Toggle the Changed state: %A" (toggleSwitch change) main()
Когда вы компилируете и запускаете программу, она выдает следующий вывод:
Switch on state: High Switch off state: Low Toggle off: High Toggle the Changed state: Low
Пример 2
type Shape = // here we store the radius of a circle | Circle of float // here we store the side length. | Square of float // here we store the height and width. | Rectangle of float * float let pi = 3.141592654 let area myShape = match myShape with | Circle radius -> pi * radius * radius | Square s -> s * s | Rectangle (h, w) -> h * w let radius = 12.0 let myCircle = Circle(radius) printfn "Area of circle with radius %g: %g" radius (area myCircle) let side = 15.0 let mySquare = Square(side) printfn "Area of square that has side %g: %g" side (area mySquare) let height, width = 5.0, 8.0 let myRectangle = Rectangle(height, width) printfn "Area of rectangle with height %g and width %g is %g" height width (area myRectangle)
Когда вы компилируете и запускаете программу, она выдает следующий вывод: