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