无涯教程-F# - 联合(Unions)

51 阅读1分钟

联合(Unions)或有区别的联合(Discriminated Unions)使您可以创建明确的选择集的复杂数据结构。如,您需要构建 choice 变量的实现,该变量具有两个值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

以下示例显示了将状态设置为高(High)或低(Low)的电压状态的实现-

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 =
   //这里存储一个圆的半径
   | Circle of float

//这里存储边长。 | Square of float

//这里存储高度和宽度。 | 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)

编译并执行程序时,将产生以下输出-

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

参考链接

www.learnfk.com/fsharp/fsha…