Perché il tipo di tupla non può essere dedotto nella ricorsione dell'elenco?
-
06-07-2019 - |
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
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