F # - Sindicatos Discriminados

As uniões, ou uniões discriminadas, permitem que você construa estruturas de dados complexas que representam um conjunto bem definido de escolhas. Por exemplo, você precisa construir uma implementação de uma variável de escolha , que tem dois valores sim e não. Usando a ferramenta Sindicatos, você pode projetar isso.

Sintaxe

As uniões discriminadas são definidas usando a seguinte sintaxe -

type type-name =
   | case-identifier1 [of [ fieldname1 : ] type1 [ * [ fieldname2 : ] 
type2 ...]
   | case-identifier2 [of [fieldname3 : ]type3 [ * [ fieldname4 : ]type4 ...]
...

Nossa implementação simples de, escolha, terá a seguinte aparência -

type choice =
   | Yes
   | No

O exemplo a seguir usa a escolha de tipo -

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()

Quando você compila e executa o programa, ele produz a seguinte saída -

x: Yes
y: No

Exemplo 1

O exemplo a seguir mostra a implementação dos estados de tensão que define um bit em alto ou baixo -

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()

Quando você compila e executa o programa, ele produz a seguinte saída -

Switch on state: High
Switch off state: Low
Toggle off: High
Toggle the Changed state: Low

Exemplo 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)

Quando você compila e executa o programa, ele produz a seguinte saída -

Area of circle with radius 12: 452.389
Area of square that has side 15: 225
Area of rectangle with height 5 and width 8 is 40