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

时间:2018-08-02 18:11:00

标签: f# pattern-matching record discriminated-union

我正在尝试创建一个简单的场景;受歧视的工会拥有会员记录的地方。尝试在简单函数中进行模式匹配时出现错误“未定义模式识别符”。

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

请帮助我解决该错误。 谢谢

1 个答案:

答案 0 :(得分:4)

语法在两个方面与您期望的不同。首先,您应该在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来访问字段。