说我有以下单一案例歧视联盟:
type OrderId = OrderId of string
在某些时候我需要实际的字符串。我发现它的提取方式是:
let id = match orderId with OrderId x -> x
有更简洁的方法吗?
我知道我的使用是一个特例,并且匹配是有意义的,以确保你已经涵盖了可能性,只是想知道是否有办法做某事:
let OrderId id = orderId
答案 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
的类型时,属性访问才会起作用(所以你通常会在函数参数中使用模式匹配,但是对其他值的属性访问)。