使用单一案例判别联合作为记录

有时创建只有一种情况的联合类型来实现类似记录的类型是有用的:

type Point = Point of float * float

let point1 = Point(0.0, 3.0)

let point2 = Point(-2.5, -4.0)

这些变得非常有用,因为它们可以通过模式匹配以与元组参数相同的方式进行分解:

let (Point(x1, y1)) = point1
// val x1 : float = 0.0
// val y1 : float = 3.0

let distance (Point(x1,y1)) (Point(x2,y2)) =
    pown (x2-x1) 2 + pown (y2-y1) 2 |> sqrt
// val distance : Point -> Point -> float

distance point1 point2
// val it : float = 7.433034374