es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)?

Tags:  ,

Answer

  1. Avatar for 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:

    let (|Match'|_|) pattern = 
        let matchOptions = RegexOptions.None
        let matchFunction input = Regex.Match(input, pattern, matchOptions)
        function
        | matchFunction input as matches -> Some matches
        | _ -> None
    

    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 original Match, pero con la adición de la variable matchFunction.

    Usando este enfoque, la función someFunc se puede definir como:

    let someFunc = 
        | Match' "...patrón 1..." coincidencias -> ...
        | Match' "...patrón 2..." coincidencias -> ...
        | Match' "...patrón 3..." coincidencias -> ...
    

    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.

Comments are closed.