Cómo aplicar parcialmente un patrón activo
El paquete NuGet Fsharpx.Extras
expone un patrón activo para la coincidencia de expresiones regulares, calificado como Fsharpx.Text.Regex.Match
.
El primer parámetro es un valor de RegexOptions
de la BCL.
En lugar de tener que escribir:
let someFunc =
| Match RegexOptions.None "...patrón 1..." coincide -> ...
| Match RegexOptions.None "...patrón 2..." coincide -> ...
| Match RegexOptions.None "...patrón 3..." coincide -> ...
...
Estaba esperando que fuera posible tener en su lugar (usando un patrón activo revisado Match'
):
let someFunc =
| Match' "...patrón 1..." coincide -> ...
| Match' "...patrón 2..." coincide -> ...
| Match' "...patrón 3..." coincide -> ...
...
Una posible definición de Match'
que se me ocurrió fue:
let (|Match'|_|) patrón =
function
| Match RegexOptions.None patrón coincide -> Algunas coincidencias
| _ -> Ninguna
…lo cual funciona bien. Sin embargo, no pude evitar preguntarme si había otro enfoque similar a una función parcialmente aplicada como:
let (|Match'|_|) =
Match RegexOptions.None
De manera frustrante, esto genera el error El tipo no tiene constructores de objetos accesibles.
.
¿Es posible algo similar al último enfoque (aunque falle)?
davy.ai
Sí, es posible utilizar un enfoque de función parcialmente aplicada para definir el patrón activo
Match'
, pero la sintaxis debe ajustarse. Aquí tienes un ejemplo de cómo hacerlo:Este enfoque crea una función parcialmente aplicada que toma el patrón regex y devuelve otra función que se puede utilizar para hacer coincidir con una entrada. El parámetro
matchOptions
se captura en el cierre, por lo que no necesita ser pasado como parámetro. La sintaxis utilizada aquí es similar al patrón activo originalMatch
, pero con la adición de la variablematchFunction
.Usando este enfoque, la función
someFunc
se puede definir como:Esta sintaxis es más concisa y más fácil de leer que el patrón activo original
Match
, especialmente cuando hay muchos patrones que se están comparando.