33

假设我有以下单一案例歧视工会:

type OrderId = OrderId of string

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

let id = match orderId with OrderId x -> x

有没有更简洁的方法来做到这一点?

我知道我的使用是一种特殊情况,匹配是有意义的,以确保您已经涵盖了可能性,只是想知道是否有办法做类似的事情:

let OrderId id = orderId
4

2 回答 2

44

您快到了。需要括号以便编译器将 let-bound 解释为模式匹配:

let (OrderId id) = orderId

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

let extractId (OrderId id) = id
于 2012-09-01T23:21:23.593 回答
19

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

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

的实现Value是使用letpad 发布的模式匹配。现在,如果你有一个orderIdtype的值OrderId,你可以写:

let id = orderId.Value

但是,模式匹配 using(OrderId id)仍然非常有用,因为属性访问仅在编译器已经知道类型的情况下才有效orderId(因此您通常会在函数参数中使用模式匹配,但对其他值使用属性访问)。

于 2012-09-02T23:21:52.160 回答