将记录(在函数式编程理论中称为产品类型)用于由多个属性描述的复杂数据,例如数据库记录或某些模型实体:
type User = { Username : string; IsActive : bool }
type Body = {
Position : Vector2<double<m>>
Mass : double<kg>
Velocity : Vector2<double<m/s>>
}
对可以枚举的数据可能值使用区分联合(称为总和类型)。例如:
type NatNumber =
| One
| Two
| Three
...
type UserStatus =
| Inactive
| Active
| Disabled
type OperationResult<'T> =
| Success of 'T
| Failure of string
请注意,可区分联合值的可能值也是互斥的——操作的结果可以是Success 或Failure,但不能同时是两者。
您可以使用记录类型对操作的结果进行编码,如下所示:
type OperationResult<'T> = {
HasSucceeded : bool
ResultValue : 'T
ErrorMessage : string
}
但是在操作失败的情况下,ResultValue 没有意义。因此,这种类型的可区分联合版本上的模式匹配将如下所示:
match result with
| Success resultValue -> ...
| Failure errorMessage -> ...
如果你的模式匹配我们操作类型的记录类型版本,那就没有意义了:
match result with
| { HasSucceeded = true; ResultValue = resultValue; ErrorMessage = _ } -> ...
| { HasSucceeded = false; ErrorMessage = errorMessage; ResultValue = _ } -> ...
它看起来冗长而笨拙,而且可能效率也较低。我认为,当您有这种感觉时,可能暗示您使用了错误的工具来完成任务。