假设我有以下单一案例歧视工会:
type OrderId = OrderId of string
在某些时候我需要实际的字符串。我发现提取它的方法是:
let id = match orderId with OrderId x -> x
有没有更简洁的方法来做到这一点?
我知道我的使用是一种特殊情况,匹配是有意义的,以确保您已经涵盖了可能性,只是想知道是否有办法做类似的事情:
let OrderId id = orderId
假设我有以下单一案例歧视工会:
type OrderId = OrderId of string
在某些时候我需要实际的字符串。我发现提取它的方法是:
let id = match orderId with OrderId x -> x
有没有更简洁的方法来做到这一点?
我知道我的使用是一种特殊情况,匹配是有意义的,以确保您已经涵盖了可能性,只是想知道是否有办法做类似的事情:
let OrderId id = orderId
您快到了。需要括号以便编译器将 let-bound 解释为模式匹配:
let (OrderId id) = orderId
如果orderId
是函数的参数,你也可以直接在那里使用模式匹配:
let extractId (OrderId id) = id
当您使用可区分联合来保存单个值(这是一种有用的 F# 编程技术)时,使用用于访问该值的属性来定义它可能是有意义的:
type OrderId =
| OrderId of string
member x.Value = let (OrderId v) = x in v
的实现Value
是使用let
pad 发布的模式匹配。现在,如果你有一个orderId
type的值OrderId
,你可以写:
let id = orderId.Value
但是,模式匹配 using(OrderId id)
仍然非常有用,因为属性访问仅在编译器已经知道类型的情况下才有效orderId
(因此您通常会在函数参数中使用模式匹配,但对其他值使用属性访问)。