Domanda

Voglio affinare il testo grezzo usando l'espressione regolare, dato un elenco di tuple (patten, sostituzione).

Ho provato a usare la corrispondenza patten sull'elemento elenco ma non ci sono riuscito, l'errore ha mostrato che questa espressione avrebbe dovuto digitare string * list list ma qui ha scritto 'a list " ;.

Come posso risolvere questo problema? Grazie mille.

I codici sono i seguenti:

let rec refine (raw:string) (rules:string*string list) = 
    match rules with
    | (pattern,replacement) :: rest ->
        refine <| Regex.Replace(raw,pattern,replacement) rest
    | [] -> raw
È stato utile?

Soluzione

Il problema è che un string * string list è una coppia composta da una stringa e un elenco di stringhe, mentre si desidera un (string * string) list :

let rec refine (raw:string) (rules:(string*string) list) =
    match rules with
    | (pattern,replacement) :: rest ->
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw

In alternativa, l'unica ragione per cui hai bisogno di quella particolare annotazione è perché Regex.Replace è sovraccarico. Questo è il motivo per cui la tua altra soluzione funziona, ma ci sono altri posti (più minimi) in cui puoi inserire un'annotazione che funzionerà:

let rec refine (raw:string) rules =
    match rules with
    | (pattern,replacement:string) :: rest ->
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw

Altri suggerimenti

Finalmente funziona quando provo questo:

let rec refine (raw:string) rules = 
    match rules with
    | rule :: rest ->
        //get tuple values beyond the patten matching
        let (pattern:string,replacement:string) = rule 
        refine (Regex.Replace(raw,pattern,replacement)) rest
    | [] -> raw
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top