Geo*_*off 29 f# pattern-matching discriminated-union
假设我有以下单一案例歧视联盟:
type OrderId = OrderId of string
Run Code Online (Sandbox Code Playgroud)
在某些时候我需要实际的字符串.我发现它的提取方式是:
let id = match orderId with OrderId x -> x
Run Code Online (Sandbox Code Playgroud)
这样做有更简洁的方法吗?
我知道我的使用是一个特殊的情况,并且匹配是有意义的,以确保你已经涵盖了可能性,只是想知道是否有办法做一些事情,如:
let OrderId id = orderId
Run Code Online (Sandbox Code Playgroud)
pad*_*pad 42
你快到了.为了使编译器将let-bound解释为模式匹配,必须使用括号:
let (OrderId id) = orderId
Run Code Online (Sandbox Code Playgroud)
如果orderId是函数的参数,您还可以直接使用模式匹配:
let extractId (OrderId id) = id
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 19
当您使用区分联合来保存单个值(这是一种有用的F#编程技术)时,使用用于访问该值的属性来定义它可能是有意义的:
type OrderId =
| OrderId of string
member x.Value = let (OrderId v) = x in v
Run Code Online (Sandbox Code Playgroud)
实现Value是使用letpad发布的模式匹配.现在,如果你有一个orderId类型的值OrderId,你可以写:
let id = orderId.Value
Run Code Online (Sandbox Code Playgroud)
但是,使用模式匹配(OrderId id)仍然非常有用,因为属性访问仅在编译器已经知道其类型时才起作用orderId(因此通常在函数参数中使用模式匹配,但对其他值使用属性访问).