包含记录的已区分联合的 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
请帮我解决错误。
谢谢
语法在两个方面与您预期的不同。首先,您应该匹配 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
访问字段一样容易。
我正在尝试创建一个简单的场景;受歧视的工会有成员记录。尝试在简单函数中进行模式匹配时出现错误 "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
请帮我解决错误。 谢谢
语法在两个方面与您预期的不同。首先,您应该匹配 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
访问字段一样容易。