0

Je veux affiner le texte brut en utilisant l'expression régulière, en donnant une liste de tuple (patten, replacement).Pourquoi le type de ligne ne peut-il pas être déduit dans la liste de récursion?

J'ai essayé d'utiliser la mise en correspondance patten sur l'élément de la liste, mais a échoué, l'erreur a montré que "Cette expression devait contenir une liste de chaînes de type chaîne * mais a ici un type" liste ".

Comment puis-je résoudre ce problème? Merci beaucoup.

codes sont les suivants:

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

Répondre

5

Le problème est qu'un string * string list est une paire constituée d'une chaîne et une liste de chaînes, alors que vous voulez 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 

Sinon, la seule raison vous avez besoin de cette annotation particulière parce que Regex.Replace est surchargé. Ceci est la raison pour laquelle votre autre solution fonctionne, mais il y a d'autres (plus minimes) endroits que vous pouvez mettre une annotation qui fonctionnera:

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

Cool, je préfère votre deuxième solution et le F # peut accomplir type inférence à partir Regex. Remplacer la liste de paramètres. Merci beaucoup. –

0

Enfin, il fonctionne quand j'essaie ceci:

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