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