F# - 可区分联合
联合或可区分联合允许您构建代表明确定义的选择集的复杂数据结构。 例如,您需要构建一个 choice 变量的实现,该变量有两个值 yes 和 no。 使用 Unions 工具,您可以进行设计。
语法
可区分联合使用以下语法定义 −
type type-name = | case-identifier1 [of [ fieldname1 : ] type1 [ * [ fieldname2 : ] type2 ...] | case-identifier2 [of [fieldname3 : ]type3 [ * [ fieldname4 : ]type4 ...] ...
我们对choice的简单实现如下所示 −
type choice = | Yes | No
以下示例使用类型 choice −
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)
当您编译并执行该程序时,它会产生以下输出 −
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