F # - Các công đoàn bị phân biệt đối xử

Công đoàn, hoặc công đoàn phân biệt đối xử cho phép bạn xây dựng cấu trúc dữ liệu phức tạp đại diện cho tập hợp các lựa chọn được xác định rõ ràng. Ví dụ: bạn cần xây dựng một triển khai của một biến lựa chọn , biến này có hai giá trị có và không. Sử dụng công cụ Unions, bạn có thể thiết kế điều này.

Cú pháp

Các công đoàn phân biệt đối xử được định nghĩa bằng cú pháp sau:

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

Cách triển khai đơn giản của chúng tôi về lựa chọn sẽ giống như sau:

type choice =
   | Yes
   | No

Ví dụ sau sử dụng lựa chọn kiểu:

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

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

x: Yes
y: No

ví dụ 1

Ví dụ sau đây cho thấy việc triển khai các trạng thái điện áp đặt một chút ở mức cao hoặc thấp -

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

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

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

Ví dụ 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)

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

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