我正在尝试创建一个简单的场景;受歧视的工会拥有会员记录的地方。尝试在简单函数中进行模式匹配时出现错误“未定义模式识别符”。
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
请帮助我解决该错误。 谢谢
答案 0 :(得分:4)
语法在两个方面与您期望的不同。首先,您应该在ACircle
和ARectangle
上进行匹配,因为这些是您的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
来访问字段。