包含记录的已区分联合的 F# 模式匹配

F# pattern matching on discriminated union containing records

我正在尝试创建一个简单的场景;受歧视的工会有成员记录。尝试在简单函数中进行模式匹配时出现错误 "pattern discriminator not defined"。

type Circle =
  {
  radius : float
  }

type Rectangle =
  {
  width : float
  height : float
  }

type Shape =
  | ACircle of Circle
  | ARectangle of Rectangle


let calcualteArea shape =
   match shape with 
   | Circle(radius) -> System.Math.PI*radius*radius  // error: pattern discriminator not defined
   | Rectangle(width, height) -> width*height

请帮我解决错误。 谢谢

语法在两个方面与您预期的不同。首先,您应该匹配 ACircleARectangle,因为它们是您的 Shape 类型的案例的名称。可区分的联合案例名称不同于类型名称。其次,模式匹配记录的语法如下所示:*

type Rectangle =
    { width: int
      height: int }

let area rectangle =
    match rectangle with
    | { width = width; height = height } -> width * height

鉴于此,您的函数应如下所示:

let calculateArea shape =
    match shape with 
    | ACircle({ radius = radius }) -> System.Math.PI*radius*radius  // error: pattern discriminator not defined
    | ARectangle({ width = width; height = height }) -> width*height

* 注意这里的模式匹配是严格可选的;您 可以 就像使用 | ARectangle(rectangle) -> rectangle.width * rectangle.height 访问字段一样容易。