F#中单例判别联合的简明模式匹配

时间:2012-09-01 23:14:31

标签: f# pattern-matching discriminated-union

说我有以下单一案例歧视联盟:

type OrderId = OrderId of string

在某些时候我需要实际的字符串。我发现它的提取方式是:

let id = match orderId with OrderId x -> x

有更简洁的方法吗?

我知道我的使用是一个特例,并且匹配是有意义的,以确保你已经涵盖了可能性,只是想知道是否有办法做某事:

let OrderId id = orderId

2 个答案:

答案 0 :(得分:41)

你快到了。为了使编译器将let-bound解释为模式匹配,需要使用括号:

let (OrderId id) = orderId

如果orderId是函数的参数,您也可以直接在那里使用模式匹配:

let extractId (OrderId id) = id

答案 1 :(得分:19)

当您使用区分联合来保存单个值(这是一种有用的F#编程技术)时,使用用于访问该值的属性来定义它可能是有意义的:

type OrderId = 
  | OrderId of string 
  member x.Value = let (OrderId v) = x in v

Value的实现正在使用pad发布的使用let的模式匹配。现在,如果您的orderId类型为OrderId,则可以写下:

let id = orderId.Value

但是,使用(OrderId id)进行模式匹配仍然非常有用,因为只有当编译器已经知道orderId的类型时,属性访问才会起作用(所以你通常会在函数参数中使用模式匹配,但是对其他值的属性访问)。