f# pattern-matching discriminated-union

Concordancia de patrón conciso en un solo caso discriminación de unión en F#



pattern-matching discriminated-union (2)

Digamos que tengo el siguiente caso de sindicato discriminado:

type OrderId = OrderId of string

En algún momento necesito la cadena real. La forma 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 la coincidencia tiene sentido para asegurar que haya cubierto las posibilidades, solo me pregunto si hay una manera de hacer algo como:

let OrderId id = orderId


Cuando utiliza una unión discriminada para mantener un valor único (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á utilizando la coincidencia de patrones utilizando let como se publicó en el pad. Ahora, si tiene un valor orderId de tipo OrderId , simplemente puede escribir:

let id = orderId.Value

Sin embargo, la coincidencia de patrones utilizando (OrderId id) sigue siendo bastante útil, porque el acceso a las propiedades solo funcionará cuando el compilador ya sepa el tipo de orderId . De orderId (por lo tanto, usaría la coincidencia de patrones en el argumento de la función, pero el acceso de propiedades para otros valores).


Ya casi estás ahí. Los paréntesis son necesarios para que el compilador interprete un límite de let como coincidencia de patrón:

let (OrderId id) = orderId

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

let extractId (OrderId id) = id