2012-09-01 16 views
25

Decir que tengo la siguiente unión discriminada solo caso:coincidencia de patrón conciso con sencillo en el caso de la unión discriminada en Fa #

type OrderId = OrderId of string 

En algún momento necesito la cadena real. La forma en que he encontrado para extraerlo es:

let id = match orderId with OrderId x -> x 

¿Hay una forma más concisa de hacer esto?

Entiendo que mi uso es un caso especial y el partido tiene sentido con el fin de asegurarse de que ha cubierto las posibilidades, preguntando si hay una manera de hacer algo como:

let OrderId id = orderId 

Respuesta

37

Usted' estamos casi allí. Los paréntesis son necesarios para que el compilador interpreta un let-obligado como la coincidencia de modelos:

let (OrderId id) = orderId 

Si orderId es un parámetro de una función, también puede utilizar la coincidencia de patrones directamente allí:

let extractId (OrderId id) = id 
18

Cuando está utilizando una unión discriminada para mantener un solo valor (que es una técnica de programación F # útil), entonces podría tener sentido definirlo con una propiedad para acceder al valor:

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

La implementación de Value está usando la coincidencia de patrón usando let según lo publicado por el teclado. Ahora, si usted tiene un valor orderId de tipo OrderId, sólo puede escribir:

let id = orderId.Value 

Sin embargo, la coincidencia de patrones utilizando (OrderId id) es todavía muy útil, ya que el acceso propiedad sólo funcionará cuando el compilador ya sabe el tipo de orderId (por lo que normalmente usaría la coincidencia de patrones en el argumento de la función, pero el acceso a la propiedad para otros valores).

Cuestiones relacionadas